A. Subtract or Divide
题意:给定一个数,可以进行两种操作,一个是减一,一个是除以它的真因子,问最少要用多少步才能达到1
思路:特殊情况考虑1、2、3,其次就是分成偶数和奇数,偶数直接让它变成2,奇数减1然后再变成2,再进行计算
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 const int maxx=2e5+10; 8 int main(){ 9 int t; 10 scanf("%d",&t); 11 while(t--){ 12 int n; 13 scanf("%d",&n); 14 if(n==1){ 15 printf("0\n"); 16 }else if(n==2){ 17 printf("1\n"); 18 }else if(n==3){ 19 printf("2\n"); 20 }else{ 21 if(n%2==0){ 22 printf("2\n"); 23 }else{ 24 printf("3\n"); 25 } 26 } 27 } 28 }
B. Non-Substring Subsequence
题意:从所给定的二进制字符串中找出一个子字符串,问是不是能够用不相邻的数字构成所选定的子字符串
思路:除了限定范围内的所选,从1-所选范围的最左边,是不是含有所选字符串最左边的数字,右边也相同,这样比较判断一下
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 const int maxx=2e5+10; 8 int main(){ 9 int t; 10 scanf("%d",&t); 11 while(t--){ 12 int n,q; 13 scanf("%d %d",&n,&q); 14 getchar(); 15 char s[200]; 16 for(int i=1;i<=n;i++){ 17 scanf("%c",&s[i]); 18 } 19 while(q--){ 20 int l,r; 21 scanf("%d %d",&l,&r); 22 char ll,rr; 23 ll=s[l]; 24 rr=s[r]; 25 int flag=0; 26 for(int i=1;i<l;i++){ 27 if(s[i]==ll){ 28 flag++; 29 } 30 } 31 for(int i=r+1;i<=n;i++){ 32 if(s[i]==rr){ 33 flag++; 34 } 35 } 36 if(flag==0){ 37 printf("NO\n"); 38 }else{ 39 printf("YES\n"); 40 } 41 } 42 } 43 }
C. String Equality
题意:给定字符串可以进行的操作:1)相邻的两个字符进行交换;2)相连的k个相同的字符进行+1;问是否字符串a通过多次操作变成b,然后输出结果
思路:相邻的字符可以交换那么字符串就可以转变成任何顺序的字符串,冒泡排序的原理,然后剩下的就是比较这些字符的个数,最主要的就是处理剩余的字符,然后判断是不是k的整数倍
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 const int maxx=2e6+10; 8 int main(){ 9 int t; 10 scanf("%d",&t); 11 while(t--){ 12 int n,k; 13 scanf("%d %d",&n,&k); 14 char c; 15 int a[30]={0},b[30]={0}; 16 getchar(); 17 for(int i=1;i<=n;i++){ 18 scanf("%c",&c); 19 a[c-‘a‘]++; 20 } 21 getchar(); 22 for(int i=1;i<=n;i++){ 23 scanf("%c",&c); 24 b[c-‘a‘]++; 25 } 26 int sum=0,flag=0; 27 for(int i=0;i<=26;i++){ 28 if((sum+a[i])<b[i]){//限定剩余必须是正的 29 flag=1; 30 break; 31 } 32 sum+=a[i]-b[i];//找到剩余 33 if(sum%k!=0){//让剩余进行变化(随便变化,所以后来才能够再进行+sum) 34 flag=1; 35 break; 36 } 37 } 38 if(flag==1){ 39 printf("NO\n"); 40 }else{ 41 printf("YES\n"); 42 } 43 } 44 }
D. Circle Game
题意:两个人玩游戏,从原点出发,可以移动k步,选择上下左右进行移动,坐标是(p,q),一定保证在这个范围内进行游戏,出了这个范围就输了游戏,问谁是赢家
思路:博弈,
原文:https://www.cnblogs.com/hunxuewangzi/p/14019016.html
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 const int maxx=2e6+10; 8 int main(){ 9 int t; 10 scanf("%d",&t); 11 while(t--){ 12 long long int d,k; 13 scanf("%lld %lld",&d,&k); 14 long long int x=0; 15 while((x+k)*(x+k)+(x+k)*(x+k)<=d*d){ 16 x+=k; 17 } 18 if((x+k)*(x+k)+x*x<=d*d){ 19 printf("Ashish\n");//Ashish 20 }else{ 21 printf("Utkarsh\n"); 22 } 23 } 24 }
Codeforces Round #685 (Div. 2)
原文:https://www.cnblogs.com/bonel/p/14471105.html