Codeforces Round #629 (Div 3) A~D题

A
签到水体

By wdjuruo, contest: Codeforces Round #629 (Div. 3), problem: (A) Divisibility Problem, Accepted, #, Copy, hack it!
#include <bits/stdc++.h>
 
using namespace std;
typedef long long ll;
 
int main() {
 
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll a,b;
        scanf("%lld%lld",&a,&b);
        if(a%b==0&&a>=b){
            cout<<0<<endl;
            continue;
        }
        printf("%lld\n",b-a%b);
    }
    return 0;
}

B
模拟题 可以看出代码中的规律

#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
 
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int n,k;
        //可以发现这个规律
        //第一个b      第二个移动个数
        /**0 - 			> 1
         * 1 -			> 2
         * 2 -			> 3
         * 3 -			> 4
         */
        scanf("%d%d",&n,&k);
        int s=1;
        int mv=0;
        while (k>=s){
            k-=s;
            mv++;
            s+=1;
        }
        
        if(k==0){
			mv--;
        //	cout<<"mv="<<mv<<endl; 
	        for(int i=1;i<=n-2-mv;i++){
	            cout<<'a';
	        }
	        cout<<'b';
	        for(int i=n-2-mv+2;i<n-(mv+1);i++){
	            cout<<'a';
	        }
	        cout<<'b';
	        for(int i=n-mv+1;i<=n;i++){
	            cout<<'a';
	        }
	        cout<<endl;
	        continue;
		}
        //cout<<"mv="<<mv<<endl; 
        for(int i=1;i<=n-2-mv;i++){
            cout<<'a';
        }
        cout<<'b';
        for(int i=n-2-mv+2;i<n-(k-1);i++){
            cout<<'a';
        }
        cout<<'b';
        for(int i=n-k+2;i<=n;i++){
            cout<<'a';
        }
        cout<<endl;
    }
    return 0;
}

C
水题
感觉比B简单

#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
 
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int n;
        scanf("%d",&n);
        string s;
        cin>>s;
        string res1="1";
        string res2="1";
        int flag=0;
        for(int i=1;i<s.length();i++){
        	if(s[i]=='0'){
        		res1+="0";
        		res2+="0";
			}
			else{
				if(s[i]=='1'&&flag==0){
					res1+="1";
					res2+="0";
					flag=1;
				}
				else if(s[i]=='1'&&flag==1){
					res1+="0";
					res2+="1";
				}
				else if(s[i]=='2'&&flag==0){
					res1+="1";
					res2+="1";
				}
				else if(s[i]=='2'&&flag==1){
					res1+="0";
					res2+="2";
				}
			}
		}
		cout<<res1<<endl<<res2<<endl;
    }
    return 0;
}

D
也是一个贪心模拟题
主要思路是 如果有相邻的2个值是相等的 那么这个数列就会有一个容错的东西,
也就是说开始我贪心的让每两个相邻的染色都不一样,不是1就是2
然后关键就是第n-1个,第n个和第1个 他们之间有关系需要处理
当他们3个不足以实现染色不同时,我们就可以从刚刚记录的容错位置开始
让他们2变1 然后1变2;
谨记不要忘了 每一种情况的处理
还是有点麻烦的

#include <bits/stdc++.h>

using namespace std;

const int maxn=2e5+5;
int a[maxn];
int flag[maxn];

int main() {

    int t;
    scanf("%d",&t);
    while (t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
        	scanf("%d",a+i);
		}
		memset(flag,0,sizeof flag);
		int ans=1;
		flag[1]=ans;
		
		
		int fx=0;
		for(int i=2;i<=n;i++){
			if(a[i]!=a[1]){
				fx=1;
			}
		}
		if(!fx){
			cout<<1<<endl;
			for(int i=1;i<=n;i++){
				cout<<1<<" ";
			}
			cout<<endl;
			continue;
		}
		
		int rat=0;//rat容错位置
		for(int i=2;i<=n;i++){
			if(a[i]==a[i-1]){
				rat=i;
			}
			if(flag[i-1]>1){
				flag[i]=flag[i-1]-1;
				ans=max(ans,flag[i]);
			}
			else{
				flag[i]=flag[i-1]+1;
				ans=max(ans,flag[i]);
			}
		}
		
		if(a[n]!=a[n-1]&&a[n]!=a[1]&&a[1]!=a[n-1]){
			if(rat==0){
				if(flag[n-1]!=flag[1]){
					ans=3;
					flag[n]=3;
					cout<<ans<<endl;
					for(int i=1;i<=n;i++){
						cout<<flag[i]<<" ";
					}
					cout<<endl; 
				}
				else{
					ans=2;
					cout<<ans<<endl;
					flag[n]=3-flag[1];
					for(int i=1;i<=n;i++){
						cout<<flag[i]<<" ";
					}
					cout<<endl;
				}
			}
			else{
				cout<<2<<endl;
				if(flag[n-1]!=flag[1]){
					for(int i=1;i<rat;i++){
						cout<<flag[i]<<" ";
					}
					for(int i=rat;i<=n;i++){
						cout<<3-flag[i]<<" ";
					} 
					cout<<endl;
				}
				else{
					flag[n]=3-flag[1];
					for(int i=1;i<=n;i++){
						cout<<flag[i]<<" ";
					}
					cout<<endl;
				}
			}
		}
		else{
			if(a[n-1]==a[1]){
				if(rat==0&&flag[n-1]!=flag[1]){
					ans=3;
					cout<<ans<<endl;
					flag[n]=ans;
					for(int i=1;i<=n;i++){
						cout<<flag[i]<<" ";
					}
					cout<<endl;
				}
				else if(rat!=0&&flag[n-1]!=flag[1]){
					cout<<2<<endl;
					for(int i=1;i<rat;i++){
						cout<<flag[i]<<" ";
					}
					for(int i=rat;i<=n;i++){
						cout<<3-flag[i]<<" ";
					}
					cout<<endl;
				}
				else if(flag[n-1]==flag[1]){
					flag[n]=3-flag[1];
					cout<<2<<endl;
					for(int i=1;i<=n;i++){
						cout<<flag[i]<<" ";
					}
					cout<<endl;
				}
			}
			else{
				if(a[n]==a[n-1]){
					flag[n]=3-flag[1];
				}
				else{
					flag[n]=3-flag[n-1];
				}
				cout<<2<<endl;
				for(int i=1;i<=n;i++){
					cout<<flag[i]<<" ";
				}
				cout<<endl;
			}
			
		}
		
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44833767/article/details/105138758
今日推荐