A题:
有n个房间排成一条线,每个房间之间都有一个通道通往下个房间,则共有n-1个通道,现在你要从1到n,而且每个房间还放有一个钥匙,如果要开这个通道,通道的钥匙你有,则通过,否则你要买相应的钥匙。
大写代表这个通道,小写代表相应的钥匙。
问你最少需要买多少把钥匙。
样例:
input
3
aAbB
output
0
input
4
aBaCaB
output
3
input
5
xYyXzZaZ
output
2
看样例应该就知道他要问什么了吧。
思路:直接扫一遍过去,看缺多少则买多少。
1 #include<cstdio> 2 #include<cstring> 3 const int maxn=100000+10; 4 char s[maxn*2]; 5 int key[30]; 6 int main() 7 { 8 int n; 9 while(scanf("%d",&n)!=EOF){ 10 n--; 11 scanf("%s",&s); 12 memset(key,0,sizeof(key)); 13 int ans=0; 14 for(int i=1;i<n*2;i++){ 15 key[s[i-1]-'a']++; 16 i++; 17 s[i-1]=s[i-1]+32; 18 if(key[s[i-1]-'a']>0) 19 key[s[i-1]-'a']--; 20 else 21 ans++; 22 } 23 printf("%d ",ans); 24 } 25 return 0; 26 }
B题:
给出一个字符串,长度为s,然后给出m个操作,每一个操作,给出一个数a,然后对字符串(1到s)的第a个到第s-a+1这一段子序列进行反转,问这m个操作后,最后字符串是什么。数据保证a*2<=s。
样例:
abcdef
1
2
output
aedcbf
input
vwxyz
2
2 2
output
vwxyz
input
abcdef
3
1 2 3
output
fbdcea
对每一个操作都进行,一定超时。
对第i个位置,翻转偶次数,等于没有翻转。
a[i]表示从第i个位置开始的字符串翻转的次数。
然后初始化后开始记录,
然后扫一遍a[i],确定字符串的第i个位置是否需要翻转。
最后输出字符串。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=200000+10; 6 char s[maxn]; 7 int a[maxn]; 8 int main() 9 { 10 while(scanf("%s",&s)!=EOF){ 11 int len=strlen(s); 12 memset(a,0,sizeof(a)); 13 int m; 14 scanf("%d",&m); 15 int u; 16 for(int i=1;i<=m;i++){ 17 scanf("%d",&u); 18 a[u]++; 19 a[len-u+1]++; 20 } 21 for(int i=1;i<=len/2;i++){ 22 a[i]=a[i]%2; 23 if(a[i]) 24 a[i+1]++; 25 } 26 for(int i=len/2+1;i<=len;i++) 27 a[i]=a[len-i+1]; 28 for(int i=1;i<=len;i++){ 29 if(a[i]) 30 printf("%c",s[len-i]); 31 else 32 printf("%c",s[i-1]); 33 } 34 printf(" "); 35 } 36 return 0; 37 }
比赛时只做了2道题,C,D,E会再补上来。