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\n",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("\n");

35     }

36     return 0;

37 }
View Code

 

比赛时只做了2道题,C,D,E会再补上来。

 

 

你可能感兴趣的:(codeforces)