本来应该去打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题:
解题思路:
代码: