Codeforces Round #696 (Div. 2)

A. Puzzle From the Future

題意:給你長度爲n一個字符串a,由0和1構成,想要輸出長度爲n的字符串b,已知字符串a+b爲d,已知我要使得d串最大,且相鄰不相等。求字符串b。
思路:因爲d串對應的每一位就是ab串對應每一位的和,列如如果a:1011 則 最優應該是1111 但是這樣對應的d就是 2122了,爲了避免最後兩位重複,所以b只能爲 1110 則d是2121是最優情況了.
一句話:從a串第一位判斷,如果a串爲0,則我輸出1,如果前一位也是1,那我輸出0,如果a串爲1,那我輸出1,如果前一位是1,則輸出0。

#include<bits/stdc++.h>
using namespace std;
int main()
{
   
   
	int n,i,j,t;
	cin>>t;
	while(t--){
   
   
		int d=111;
		string s1,ans;
		cin>>n>>s1;
		for(i=0;i<s1.length();i++){
   
   
			if(s1[i]=='0'){
   
   
				if(d!=1)
					d=1,ans+='1';
				else 
					d=0,ans+='0';
			}
			else if(s1[i]=='1'){
   
   
				if(d!=2)
					d=2,ans+='1';
				else 
					d=1,ans+='0';
			}
		}
		cout<<ans<<endl;
	}
}	

B. Different Divisors

題意:找到一個除數至少爲4,且除數相鄰的差至少爲d。
思路:打表找規律,發現符合條件的最優解是除開1和它本身外,還有兩個素數爲質數。所以找兩個質數且他們的差大於d就好。

#include<bits/stdc++.h>
using namespace std;
bool jg(int i){
   
   
	int cnt=0;
	for(int d1=2;d1<=sqrt(i);d1++){
   
   
		if(i%d1==0)
			return 0;
	}
	return 1;
}
int main()
{
   
   
	int t,n,i,j,d,ans;
	cin>>t;
	while(t--){
   
   
		cin>>d;
		if(d==1){
   
   
			cout<<6<<endl;
		}
		else {
   
   
			int ans1,ans2;
			for(i=d+1;;i++){
   
   
				if(jg(i)==1){
   
   
					ans1=i;break;
				}
			}
			for(i=d+ans1;;i++){
   
   
				if(jg(i)){
   
   
					ans2=i;break;
				}
			}
			cout<<ans1*ans2<<endl;
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章