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;
}
题意:构造一个长度为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;
}
题意:将串中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;
}