Codeforces Round #297 (Div. 2) 题解

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 }
View Code

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 }
View Code
比赛时只做了2道题,C,D,E会再补上来。
原文地址:https://www.cnblogs.com/-maybe/p/4372917.html