本来应该去打DIV1的,但是,今天这场div1打的闹心,还是因为自己太弱了,没有达到div1的实力,刚刚吃完饭,,把div2的AB题补掉了,等明天把C题和D题做掉。。
A题:
解题思路:
这道题就是说,输入n个长度的字符串,然后,让你不论大小写,只要能在这n个字符中含有'a'-'z'的话,就说明这个字符串是个program。那么,我们就开始把输入的不论大小写都转换成小写,然后用字符串hash去统计就行了,'a'->1 'b'->2 'c'->3.。。。。。
代码:
# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>
using namespace std;
# define inf 999999999
char s[123];
int hash[27];
int main(void)
{
int n;
while ( cin>>n )
{
cin>>s;
for ( int i = 0;i < n;i++ )
{
if ( s[i]>='A'&&s[i]<='Z' )
{
s[i]+=32;
}
}
for ( int i = 0;i < n;i++ )
{
hash[s[i]-'a'+1]++;
}
int flag = 0;
for ( int i = 1;i <= 26;i++ )
{
if ( hash[i] ==0 )
{
flag = 1;
break;
}
}
if ( flag )
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}
B题:
解题思路:
就是说现在有两种操作,一个操作是将n*2,一个操作是n-1,问经过最少的步骤使得m==n,一开始看到后,想用bfs去搜的,但是感觉贪心更简单一点,开始分三种情况,
当n>m的时候,我们就输出n-m。
当n==m的时候,我们就输出0
当n<m的时候,我们就利用贪心的思想倒过来想,怎么样把m变成n,当m为偶数的时候,直接m/2,操作数++,当m为奇数的时候,直接加1,直到n==m为止
代码:
# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>
using namespace std;
# define inf 999999999
int main(void)
{
int n,m;
cin>>n>>m;
if( n == m )
{
cout<<"0"<<endl;
}
else if( n > m )
{
cout<<n-m<<endl;
}
else
{
int ctr=0;
while( n!=m )
{
if( m%2 == 0 && n < m )
{
m/=2;
ctr++;
}
else
{
m+=1;
ctr++;
}
}
cout<<ctr<<endl;
}
return 0;
}
C题:
这题就是div1的A题了,当时想了好一会,没什么思路,还SB到在纸上花了个n*n阶的矩阵,让这个矩阵的行来观察t串的变化,让这个矩阵的列来观察s的变化,,果然被骗进了出题人的圈套中。根据题目的意思,就是说,t只能由AGCT构成,而S也是这样输入的,按照向左循环的规定,我们可以把一位一位的改变,直到s[i]和t[i]相等的个数最多,问的就是这样最多的有多少个。。。其实就是把S串中最大种类数目的个数拿出来玩n次方。
代码:
# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>
using namespace std;
# define inf 999999999
# define MAX 100000+7
typedef long long ll;
const ll MOD = 1000000000+7;
int ans[5];
char s[MAX];
ll my_pow( int k,int n )
{
ll res = 1;
for ( int i = 1;i <= n;i++ )
{
res = ( res*k )%MOD;
}
return res;
}
int main(void)
{
int n;cin>>n;
cin>>s;
for ( int i = 0;i < n;i++ )
{
if ( s[i]=='A' )
ans[0]++;
else if ( s[i] == 'C' )
ans[1]++;
else if ( s[i] == 'G' )
ans[2]++;
else
ans[3]++;
}
sort(ans,ans+4);
if ( ans[0]==ans[3] )
cout<<my_pow(4,n);
else if ( ans[1]==ans[3] )
cout<<my_pow(3,n);
else if ( ans[2]==ans[3] )
cout<<my_pow(2,n);
else
cout<<my_pow(1,n);
return 0;
}
D题没看,
E题:
解题思路:
代码: