编程之美2013全国挑战赛测试赛

时间限制: 1000ms 内存限制: 1024MB

 

描述

输入两个正整数A和B, 求A+B的值

输入

两个正整数A, B

输出

A+B的和

 

对于小数据, 0 < A, B <= 10; 对于大数据, 0 < A, B <= 10 100

 

 

样例输入
2 3
样例输出
5
 代码如下:
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 
 5 using namespace std;
 6 
 7 char str1[110], str2[110];
 8 int a[110], b[110];
 9 
10 int main()
11 {
12     while(scanf("%s%s", str1, str2) != EOF)
13     {
14         int len1 = strlen(str1);
15         int len2 = strlen(str2);
16         memset(a, 0, sizeof(a));
17         memset(b, 0, sizeof(b));;
18         for(int i = len1-1, j = 0; i >= 0; --i)
19             a[j++] = str1[i] - '0';
20         for(int i = len2-1, j = 0; i >= 0; --i)
21             b[j++] = str2[i] - '0';
22         for(int i = 0, t = 0; i < 110; ++i)
23         {
24             t += a[i] + b[i];
25             a[i] = t % 10;
26             t /= 10;
27         }
28         int i = 110;
29         while(a[--i] == 0);
30         for(; i >=0; --i)
31             printf("%d", a[i]);
32         printf("\n");
33     }
34     return 0;
35 }

时间限制: 1000ms 内存限制: 1024MB

 

描述

石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。
一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期的。请问,小A和小B比了N轮之后,谁赢了?

输入

输入的第一行包含一个整数K,表示K组测试数据。
之后的每组测试数据包含三行。第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。第二行包含NA个整数,表示小A出拳的规律,第三行包含NB个整数,表示小B出拳的规律。其中,0表示“石头”,2表示“剪刀”,5表示“布”。

 

对于小数据,0 < K,N,NA,NB <= 10;对于大数据,0 < K,N,NA,NB <= 100;

 

输出

对于每组测试数据,输出一行。如果小A赢了,输出A;如果小B赢了,输出B;如果两人打平,输出draw。

 

提示

对于第一组测试数据,猜拳过程为:
A:0 2 5 0 2 5 0 2 5 0
B:0 5 0 2 0 5 0 2 0 5
所以A赢了4轮,B赢了2轮,双方打平4轮,所以A赢了。
对于第二组测试数据,猜拳过程为:
A:2 0 5 2 0
B:0 2 5 0 2
所以A赢了2轮,B赢了2轮,双方打平1轮,所以最终打平了。

 

 

样例输入
2
10 3 4
0 2 5
0 5 0 2
5 3 3
2 0 5
0 2 5
样例输出
A
draw
代码如下:
 1 #include <cstdio>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 int scorea, scoreb;
 7 void judge(int a, int b)
 8 {
 9     if(!(a^b))
10         return;
11     if(a == 0)
12     {
13         if(b == 2)
14             ++scorea;
15         else
16             ++scoreb;
17     }
18     else if(a == 2)
19     {
20         if(b == 0)
21             ++scoreb;
22         else
23             ++scorea;
24     }
25     else
26     {
27         if(b == 0)
28             ++scorea;
29         else
30             ++scoreb;
31     }
32 }
33 
34 int main()
35 {
36     int T, n, na, nb;
37     int a[105], b[105];
38     scanf("%d", &T);
39     while(T--)
40     {
41         scorea = scoreb = 0;
42         scanf("%d%d%d", &n, &na, &nb);
43         for(int i = 0; i < na; ++i)
44             scanf("%d", &a[i]);
45         for(int i = 0; i < nb; ++i)
46             scanf("%d", &b[i]);
47         for(int i = 0; i < n; ++i)
48             judge(a[i%na], b[i%nb]);
49         if(scorea > scoreb)
50             printf("A\n");
51         else if(scorea < scoreb)
52             printf("B\n");
53         else
54             printf("draw\n");
55     }
56     return 0;
57 }

时间限制: 1000ms 内存限制: 1024MB

 

描述

有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
a.    每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;
b.    走过的格子立即塌陷无法再走第二次;
c.    只能向北、东、西三个方向走;
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。

输入

允许在方格上行走的步数n

输出

计算出的方案数量

 

对于小数据1 <= n <= 20; 对于大数据1 <= n <= 100.

 

 

样例输入
2
样例输出
7
 代码如下:


这道题由于数据量很大,暂时还没有想到如何处理大数据的问题

解题思路:
因为走过之后的格子是不能再走的,所以如果第k步是往北走的,那么第 k+1 步可以往
三个方向走如果第k步是往东(往西)走的,那么第 k+1 步只能往北或者往东
(往北或者往西)走两种可能
a[i] 记录走第i步是往北走的个数
b[i] 记录走第i步是往东或者者西时候的个数

 1 #include <cstdio>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 long long a[105], b[105];
 7 
 8 void fun()
 9 {
10     a[0] = 1;
11     b[0] = 0;
12     for(int i = 1; i <= 100; ++i)
13     {
14         a[i] = a[i-1] + b[i-1];
15         b[i] = 2 * a[i-1] + b[i-1];
16     }
17 }
18 int main()
19 {
20     int n;
21     fun();
22     while(~scanf("%d", &n))
23     {
24         printf("%lld\n", a[n] + b[n]);
25     }
26     return 0;
27 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值