ACM-南京理工大学第八届程序设计竞赛-网络赛(2016.04.17)

A、偷吃糖果
Time Limit: 1000Ms

Memory Limit: 65536KB

Description
小鱼喜欢吃糖果。他有两盒糖果,两盒糖果分别仅由小写字母组成的字符串s和字符串t构成。其中'a'到'z'表示具体的某种糖果类别。
他原本打算送给他喜欢的女生,但是要送给女孩子的话两盒糖果不能有差别(即字符串s和t完全相同)。所以,他决定偷吃几块,他吃糖果的策略是每次选出一盒糖果中两个连续的同种类别的糖果,然后吃掉其中一块。该策略可以使用多次。
例如一盒糖果是'rrrjj',他可以把这盒糖果变成'rrjj'或者'rrrj'。现在你要告诉小鱼,经过他多次偷吃糖果之后,两盒糖果能否送给他喜欢的女孩子。如果可以输出'Yes',如果不行输出'No'。
Input
第一行一个T,表示T组测试数据。每组测试数据格式如下。
第一行表示字符串s,第二行表示字符串t。
1 ≤ T ≤ 100
Each character of s, t will be between 'a' and 'z'.
1 ≤ length of string s ≤ 1000
1 ≤ length of string t ≤ 1000
Output
对于每组测试数据,输出Yes,或者No。
Sample Input
2
rrrjj
rrrj
rj
jr
Sample Output
Yes
No
Hint
题目中的第一个样例:
第一盒糖果:rrrjj -> rrjj -> rjj -> rj
第二盒糖果:rrrj -> rrj -> rj

分析:咋一看以为是字符串匹配,后来题意理解错了,然后开始从新写,看这句话“两个连续的同种类别的糖果”

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 int main(void)
 5 {
 6     char a[1100], b[1100], a1[1100], b1[1100],c;
 7     int i1,i, j, t, n;
 8 
 9     scanf("%d", &t);
10         c = getchar();
11         for (i1 = 0;i1 < t;i1++)
12         {
13             gets(a);
14             gets(b);
15             j = 0;
16             for (i = 1;a[i] != '\0';i++)
17             {
18                 if (a[i] != a[i - 1])
19                 {
20                     a1[j] = a[i - 1];
21                     j++;
22                 }
23             }
24                 a1[j] = a[i - 1];
25                 j++;
26             a1[j] = '\0';
27             j = 0;
28             for (i = 1;b[i] != '\0';i++)
29             {
30                 if (b[i] != b[i - 1])
31                 {
32                     b1[j] = b[i - 1];
33                     j++;
34                 }
35             }
36                 b1[j] = b[i - 1];
37                 j++;
38             b1[j] = '\0';
39             if (strcmp(a1, b1) == 0)
40                 printf("Yes\n");
41             else
42                 printf("No\n");
43         }
44 }

 

H、谁才是最强战舰!
Time Limit: 1000MS

Memory Limit: 65536KB

Description
依阿华来到镇守府的第一件事情,就是找大和solo!
然而这并不是什么好消息,说不定,镇守府,甚至佐伯湾就这么消失了。。。
于是,提督君想了一个简单的游戏,来分出她们的胜负。游戏规则如下:这里有N堆石子,每堆石子有a[i](1<=i<=N)个,每人轮流从其中的某一堆石子中拿出任意个石子(只能在其中一堆拿,不能不拿),大和先手,谁拿出了最后一个石子,谁输。若大和必胜,输出“Yamato_Saikou!”,若依阿华必胜,输出“Meidikeji_Shijiediyi!”,若两边都无法必胜,输出“Sayonara_Konosekai!”.
Input
第一行输入一个正整数T(1 <= T <= 1000),表示有T组测试数据。
对于每组测试数据:
第一行一个正整数,N(N<=1000),表示有N堆石子。
第二行N个整数a[i](1<=a[i]<=1000),表示每堆石子的数量。
Output
若大和必胜,输出“Yamato_Saikou!”,若依阿华必胜,输出“Meidikeji_Shijiediyi!”,若两边都无法必胜,输出“Sayonara_Konosekai!”.
Sample Input
3
1
5
2
1 2
3
1 1 1
Sample Output
Yamato_Saikou!
Yamato_Saikou!
Meidikeji_Shijiediyi!

思路:anti-nim博弈,题目给出这句话,自己感觉蒙圈了,好像没有用到

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int t;
 5     scanf("%d",&t);
 6     while(t--)
 7     {
 8         int n,s=0,m,c=0;
 9         scanf("%d",&n);
10         m=n;
11         while(n--)
12         {
13             int num;
14             scanf("%d",&num);
15             s^=num;
16             if(num>1)
17                 c++;
18         }
19         if(!s&&!c||(s&&c))
20             printf("Yamato_Saikou!\n");
21         else
22             printf("Meidikeji_Shijiediyi!\n");
23     }
24 }

 

C、count_prime
Time Limit: 1000ms

Memory Limit: 65536KB

Description
给定你一个数n,请你统计出在[a,b]这个区间中和n互质的数的个数。
两个数互质当且仅当他们除了1之外没有其他的公共因子或者他们最大的公共因子是1。1和任何数是互素的。
Input
第一行输入一个整数T(1 <= T <= 100),表示T组测试数据。
接下来T行,每行3个整数a,b,n(1 <= a <=b <=10^15, 1<= n <= 10^9),用空格隔开。
Output
输出一个整数表示和n互质的数的个数。
Sample Input
2
1 10 2
3 10 5
Sample Output
5
6

灰灰做的:思路是容斥原理

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring>  
 4 using namespace std;  
 5 #define LL long long   
 6 #define maxn 70  
 7   
 8 LL prime[maxn];  
 9 LL make_ans(LL num,int m)  
10 {  
11     LL ans=0,tmp,i,j,flag;  
12     for(i=1;i<(LL)(1<<m);i++) 
13     {  
14         tmp=1,flag=0;  
15         for(j=0;j<m;j++)   
16             if(i&((LL)(1<<j))) 
17                 flag++,tmp*=prime[j];  
18         if(flag&1)//容斥原理   
19             ans+=num/tmp;  
20         else  
21             ans-=num/tmp;  
22     }  
23     return ans;  
24 }  
25   
26 int main()  
27 {  
28     int T,t=0,m;  
29     LL n,a,b,i;  
30     scanf("%d",&T);  
31     while(T--)  
32     {  
33         scanf("%I64d%I64d%I64d",&a,&b,&n);  
34         m=0;  
35         for(i=2;i*i<=n;i++)  
36             if(n&&n%i==0)  
37             {  
38                 prime[m++]=i;  
39                 while(n&&n%i==0)  
40                     n/=i;  
41             }     
42         if(n>1)  
43             prime[m++]=n;  
44         printf("%I64d\n",(b-make_ans(b,m))-(a-1-make_ans(a-1,m)));  
45     }  
46     return 0;  
47 }  

一共做出5题,未完待续。。。。。。。

posted @ 2016-04-17 23:57  saucxs  阅读(863)  评论(1编辑  收藏  举报