0
点赞
收藏
分享

微信扫一扫

Educational Codeforces Round 82 (Rated for Div. 2)

芭芭蘑菇 2022-09-26 阅读 164

​​http://codeforces.com/contest/1303​​

A:    第一题给一个只有01的字符串,操作是可以删除0,结果要保证1都是挨着的。问最小操作数。
     解析:特判,len=1是直接输出0。其他的就是找到第一个为1而且下一位为0的位置,以此往下找,找到第一个为1而且j!=i+1就可以了,减一下就是操作数。

  

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e3;

int main()
{
int t;
cin>>t;
while(t--)
{
char s[maxn];
cin>>s;
int len=strlen(s);
int sum=0;
if(len==1)
cout<<"0"<<endl;
else
{
//int sum=0;
for(int i=0;i<len;i++)
{
if(s[i]=='1'&&s[i+1]=='0')
{
int k=-1;
for(int j=i+1;j<len;j++)
{
if(s[j]=='1'&&j!=i+1)
{
k=j;break;
}
}
if(k!=-1)
sum+=k-i-1;
}
}
cout<<sum<<endl;
}
}
}

B

给出路长度n,good天数和bad天数,good天里完成的修路的质量高。要求n的一半为高质量,而且要完成长度n的修建,问最少需要多少天。
解析:  1.如果good>=n或者good>=n/2,直接输出n。
           2.算出完成上述目标需要的天数。根据周期来看,算出good周期数:n/2/g,  则bad周期数就是good周期数-1。而如果mid/g不能整除
    那么bad周期数还要+1。总公式就是:sum=bad周期数*bad+good周期数*good+n/2/g的余数。如果sum>n,输出n,否则输入sum

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e3;
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,g,b;
cin>>n>>g>>b;
if(n<=g)
{
cout<<n<<endl;continue;
}
int mid;
if(n%2!=0)
mid=n/2+1;
else
mid=n/2;
if(g>=mid)
cout<<n<<endl;
else
{
int k=mid/g;
int yu=0;
int bb=k-1;
if(mid%g!=0)
{
yu=mid%g;
bb++;
}
// 19 7 3 2
//cout<<k<<" ";
ll sum=bb*b+k*g+yu;
//cout<<"bb: "<<bb<<" k: "<<k<<" yu: "<<yu<<endl;
if(sum<=n)
cout<<n<<endl;
else
cout<<sum<<endl;
}

}
}

C:    给一个字符串,相邻字符不同,设计一个键盘,里面的下一个字母是当前字母的相邻位置。如果存在输出YES+布局,否则NO
     解析: vis[] :标记字母是否出现
         a[] :记录相邻情况
         k :指向位置
        初始a[]中间放上字符串的第一个字符,标记vis=1,k指向当前位置,然后for遍历,左右放就可以了。
      放的时候对于当前要放的字符s[i],有两种情况:

        1:之前出现过,那么看a[k]左右,如果a[k-1]==s[i]||a[k+1]==s[i],对应的
      k左移或者右移。如果没满足相等条件,直接输出NO。
        2:之前没出现过,看a[k]左右,哪个空,放哪儿,k对应的移动,并且vis[s[i]]==1。如果左右都不为空那么直接输出NO,因为
      一个字母和三个字母相邻是不能实现键盘的。
        结尾,输出a[]里的字符,再根据vis标记的来输出26个字母中没出现过的字符。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
typedef pair<char,char>p;

int main()
{
int t;
cin>>t;
while(t--)
{
char s[210];
int vis[27];
char a[100];
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
cin>>s;
int k=27,no=0;
a[k]=s[0];
vis[s[0]-'a']=1;
for(int i=1;i<strlen(s);i++)
{
if(vis[s[i]-'a'])
{
if(a[k-1]==s[i])
{
k--;
}
else if(a[k+1]==s[i])
{
k++;
}
else
{
no=1;break;
}
}
else
{
if(!a[k-1])
{
k--;
}
else if(!a[k+1])
{
k++;
}
else
{
no=1;break;
}
a[k]=s[i];
vis[s[i]-'a']=1;
}
}
if(no)
cout<<"NO"<<endl;
else
{
cout<<"YES"<<endl;
for(int i=0;i<100;i++)
{
if(a[i]>='a'&&a[i]<='z')
cout<<a[i];
}
for(int i=0;i<26;i++)
{
if(!vis[i])
cout<<char(i+'a');
}
cout<<endl;
}
}
}

 



举报

相关推荐

0 条评论