CF--805A Fake NP
题目链接
题意:找到一个数字,使得[ l , r ]内以它为因子的数最多;
题解:显然大部分情况,这个数字是2;如果 l == r ,这个数字是 l;
Code:
#include <bits/stdc++.h> using namespace std; int l,r; int main() { scanf("%d%d",&l,&r); if(l==3&&r==6) { cout<< 3 <<endl; return 0; } if(l==r) { cout<< l <<endl; return 0; } cout << 2 << endl; return 0; }CF--805B 3-palindrome
题意:构造一个长度为n的,由a,b,c组成的串,不能含有长度为3的回文串,使c的次数尽量少;、
解法:直接输出“aabbaabbaa....”
Code:
#include<bits/stdc++.h> //不能有长度为3的回文串 //aabbaabbaa就可以输出 using namespace std; int n; char s[10]="aabb"; int main() { scanf("%d",&n); for(int i=0;i<n;) { for(int j=0;j<4&&i<n;j++) { i++; printf("%c",s[j]); } } printf("\n"); return 0; } CF--805C Find Amir题目链接
题意:遍历n个点,i与j之间的距离为(i+j)%(n+1),到过的地点不用再花费;
题解:从外向内走其中(1<-->n)(2<-->n-1)(3<-->n-2)(4<-->n-3).....的花费为0;而从(2<-->n)(3<-->n-1)(4<-->n-2)......的花费均为1;显然通过这两种路就可以以最小的话费遍历所有点,因此,此题被转换为求:长度为n-1的01010101.....串的和 == (n-1)/2;
Code:
#include<bits/stdc++.h> using namespace std; int n; int main() { scanf("%d",&n); cout << (n-1)/2 << endl; return 0; }CF--805D Minimum number of steps
题目链接
题意:将串中ab转化为bba,直到整个串中不包含ab停止,问一共有几次转换;
解法:ab-->baa会对前面的a产生影响,因此,从后向前扫计算b的个数;遇到a把之前的b的个数加到移动数上,就将之前的b的个数翻倍,遇到b就将b的个数+1;
Code:
#include <bits/stdc++.h> #define ll long long using namespace std; int n,cnt,t=55; const ll mod = 1000000007; string s; char s1[1000005];\ //每一个a会使它后边的b翻一倍,因此倒着扫,记录b的个数,遇见a就将b的个数翻倍,每次记录————新产生的b的个数==翻倍前b的个数 //扫到b就把b的个数+1,不更新移动的次数; int main() { ll cnt=0,ans=0; scanf("%s",s1); for(int i=strlen(s1)-1;i>=0;i--) { if(s1[i]=='b') { cnt++; } else { ans+=cnt; ans%=mod; cnt*=2; cnt%=mod; } cout<< ans << ' ' << cnt <<endl; } //暴力模拟************** /* while(cin>>s) { t=55,cnt=0; string::iterator IT=s.begin(); while(*IT=='b') { s.erase(IT); IT++; } string::iterator IT1=s.end(); IT1--; while(*IT1=='a') { s.erase(IT1); IT1--; } while(t!=cnt) { t=cnt; for(int i=1; i<s.size(); i++) { if(s[i]=='b'&&s[i-1]=='a') { s[i]='b'; s[i-1]='b'; string::iterator it=s.begin()+i+1; s.insert(it,'a'); cnt++; } } } cout << cnt << endl; } */ return 0; }//我好弱。。。