0
点赞
收藏
分享

微信扫一扫

Codeforces Round #629 (Div. 3)

地址:​​https://codeforces.com/contest/1328​​

 

Codeforces Round #629 (Div. 3)_i++

 

 

题意:a,b。a只能+1操作。求最少几步能整除b

     解析:分类讨论即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,m;
cin>>n>>m;
if(n%m==0)
cout<<"0"<<endl;
else
{
if(n<m)
cout<<m-n<<endl;
else
{
ll mid=n/m;
cout<<m*(mid+1)-n<<endl;
}
}
}
}

Codeforces Round #629 (Div. 3)_#include_02

 

 

题意:长为n的只含a,b的字符串,含有2个b,n-2个a。给出k,求第k大的字符串。输出它

     解析:规律题。。。这些字符串就是按字典序排列的。上图n=5,这张图是从右往左来记下标,表示每次b的两个出现位置。

Codeforces Round #629 (Div. 3)_ios_03

 

 

 

L每次就成了一组等差数列:1,1,2,1,2,3,1,2,3,4.....而且发现,每个等差数列的和,恰好对应==k。根据d=1的等差数列求和公式(i*i+i)/2,找出第一个>=k的,这个i值,就是L下标的最大情况,L+1,就是R了。这个R是精准的。但是L怎么求?根据观察,实际的L就等于L-((L*L+L)/2-K)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=1e5+20;
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,m;
cin>>n>>m;
ll l,r;
for(ll i=1;i<=n;i++)
{
if(i*i+i>=2*m)
{
l=i;break;
}
}
ll md=(l*l+l)/2;
r=l-((l*l+l)/2-m);
for(ll i=n;i>=1;i--)
{
if(i==r||i==l+1)
cout<<"b";
else
cout<<'a';
}
cout<<endl;
}
}

Codeforces Round #629 (Div. 3)_#include_04

Codeforces Round #629 (Div. 3)_#include_05

 

 题意:给出长度为n的x,这个x开头必须是2,其他部分由0,1,2组成。求出长度同为n的两个数a,b,要求每一位xi==(ai+bi)%3,而且开头不为0。要求max(a,b)最小。

解析:往a,b那平分就行了。把它们当字符串处理,所以就是个字典序问题。每次比较a,b的大小,把数字尽量往它们身上平分。a!=b的话,大的给小,小的给大。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=1e5+20;
int main()
{
int t;
cin>>t;
while(t--)
{
ll n;
cin>>n;
string s;
cin>>s;
string c1,c2;
for(int i=0;i<s.length();i++)
{
if(i==0)
{
c1+='1';
c2+='1';
}
else
{
if(s[i]=='2')
{
if(c1>c2)
{
c1+='0';
c2+='2';
}
else if(c1==c2)
{
c1+='1';
c2+='1';
}
else
{
c1+='2';
c2+='0';
}
}
if(s[i]=='1')
{
if(c1>c2)
{
c1+='0';
c2+='1';
}
else
{
c1+='1';
c2+='0';
}
}
if(s[i]=='0')
{
c1+='0';
c2+='0';
}
}
}
cout<<c1<<endl<<c2<<endl;
}
}

Codeforces Round #629 (Div. 3)_ios_06

Codeforces Round #629 (Div. 3)_#include_07

 

题意:n个动物,给出编号,不同编号表明不是同一种动物。要求给它们染色,保证相邻不相同的不能染同一种颜色。输出所需最少颜色数以及染色结果。!注意是个环!

解析:1:对于n是偶数的情况,那么只需要两种染料,1,2,1,2依次染就可以了。

        2:n是奇数的话,如果没有出现两个相邻的是同一种动物,就需要三种燃料,1,2,1,2......3结尾染成3就可以了。

        3:n是奇数,如果出现了两个相邻的是同一种动物(环,首尾相同也算),那么把它俩合并染上同一种颜色,那么总的就成偶数个了。1,2,1,2依次染下去就行了,总的燃料数是2。我这里为了避免麻烦,先判断了首尾相同的情况,没有的话再判断中间情况。注意,此题细节颇多,模拟的时候头脑一定要清晰。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=2e5+10;
int a[maxn],b[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int ok1=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(i>1&&a[i]!=a[i-1])
ok1=1;
}
if(!ok1)
{
cout<<"1"<<endl;
for(int i=1;i<=n;i++)
{
if(i<n)
cout<<"1"<<" ";
else
cout<<"1"<<endl;
}
}
else if(n%2==0)
{
cout<<"2"<<endl;
for(int i=1;i<=n;i++)
{
if(i<n)
{
if(i%2!=0)
cout<<"1"<<" ";
else
cout<<"2"<<" ";
}
else
{
if(i%2!=0)
cout<<"1"<<endl;
else
cout<<"2"<<endl;
}
}
}
else
{
if(a[1]==a[n])
{
cout<<"2"<<endl;
cout<<"1"<<" ";
for(int i=2;i<n;i++)
{
if(i%2==0)
cout<<"2"<<" ";
else
cout<<"1"<<" ";
}
cout<<"1"<<endl;
}
else
{
int k=-1;
for(int i=1;i<n;i++)
{
if(a[i]==a[i+1])
{
k=i;break;
}
}
if(k==-1)
{
cout<<"3"<<endl;
for(int i=1;i<n;i++)
{
if(i%2!=0)
cout<<"1"<<" ";
else
cout<<"2"<<" ";
}
cout<<"3"<<endl;
}
else
{
memset(b,0,sizeof(b));
cout<<"2"<<endl;
if(k%2!=0)
b[k]=1,b[k+1]=1;
else
b[k]=2,b[k+1]=2;

for(int i=1;i<k;i++)
{
if(i%2!=0)
b[i]=1;
else
b[i]=2;
}
for(int i=k+2;i<=n;i++)
{
if(i%2!=0)
b[i]=2;
else
b[i]=1;
}
for(int i=1;i<n;i++)
cout<<b[i]<<" ";
cout<<b[n]<<endl;
}
}
}
}
}

 



举报

相关推荐

0 条评论