做出了4题,还不错,可惜还是掉rating……能保持在蓝名已经不错了。
题目跳转链接。
【A】公平的游戏
题意:
Petya和Vasya在玩游戏。他们有n张卡片(n是偶数)。每张卡片上有一个整数。
游戏开始前,Petya会选出一个数,然后Vasya会选出另一个数(不同于Petya选的数),然后每人从卡片中抽出所有写着他选中的数的卡片。
举个例子,Petya选了5,而Vasya选了10,那么Petya抽出所有写着5的卡片,而Vasya抽出所有写了10的卡片。
如果Petya和Vasya能抽走所有卡片,并且Petya和Vasya获得的卡片数量相同,那么这个游戏是公平的。
判断这个游戏是否公平!
输入:
第一行,一个数(n\,(2leqslant nleqslant100))。
接下来n行包含了一个整数序列(a_{1},a_{2},cdots,a_{n})(每行一个数,(1leqslant a_{i}leqslant 100))。
输出:
如果游戏是公平的,输出"YES",并在下一行输出两个数,表示Petya和Vasya选的两个数,能让这个游戏公平。
如果游戏不是公平的,输出"NO"。
样例:样例见原题。
题解:
水题。看懂了题意就会做了。要求在序列中只有两种不同的数,并且这两种数的数量相同。
1 #include<cstdio> 2 int num[1000],n; 3 int main(){ 4 scanf("%d",&n); 5 int x; 6 for(int i=1;i<=n;++i) scanf("%d",&x), num[x]++; 7 int ns=0,a1=0,a2=0; 8 for(int i=1;i<=100;++i){ 9 if(num[i]){ 10 ++ns; 11 if(!a1) a1=i; 12 else a2=i; 13 } 14 if(ns>2){puts("NO");return 0;} 15 } 16 if(ns==2){ 17 if(num[a1]==num[a2]) printf("YES %d %d",a1,a2); 18 else puts("NO"); 19 } 20 else puts("NO"); 21 return 0; 22 }
【B】Polycrap和字母
题意:
Polycrap喜爱小写字母,而讨厌大写字母。他拿到了一个字符串(s),只包含小写和大写字母。
他想从这个字符串中选出一个最大的位置的集合(A),使这个集合满足:
①在(s)中(A)中的元素位的字符互不相同且都为小写字母。
②这些位置之间在s中没有一个是大写字母,即对于任意(a_{1}<j<a_{2}),(s[j])都不为大写字母((a_{1},a_{2}in A))。
告诉Polycrap这个集合的大小。
输入:
第一行,一个整数(n,\,(1leqslant nleqslant 200)),表示s的长度。
第二行,字符串s,长度为n,只包含大写和小写字母。
输出:
一个数,表示集合的大小。
样例:样例见原题。
题解:
仔细分析题意,可以得出:要求的是任意两个相邻的大写字母之间的不同的小写字母的最大个数。
#include<cstdio> int n,ans=0; char str[9999]; int vis[2222]; int main(){ scanf("%d",&n); scanf("%s",str); str[n]='A'; str[n+1]='