A:石头剪刀布
描述
石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。
一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A和小B比了N轮之后,谁赢的轮数多?
输入
输入包含三行。
第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。0 < N,NA,NB < 100。
第二行包含NA个整数,表示小A出拳的规律。
第三行包含NB个整数,表示小B出拳的规律。
其中,0表示“石头”,2表示“剪刀”,5表示“布”。相邻两个整数之间用单个空格隔开。
输出
输出一行,如果小A赢的轮数多,输出A;如果小B赢的轮数多,输出B;如果两人打平,输出draw。
样例输入
10 3 4
0 2 5
0 5 0 2
样例输出
A
提示
对于测试数据,猜拳过程为:
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赢的轮数多。
1 #include <cstdio> 2 #include <string> 3 #include <algorithm> 4 #include <stdlib.h> 5 6 using namespace std; 7 8 const int maxn = 105; 9 int a[maxn], b[maxn]; 10 int n, na, nb; 11 12 void init() { 13 scanf("%d%d%d", &n, &na, &nb); 14 for (int i = 0; i < na; i++) 15 scanf("%d", &a[i]); 16 for (int i = 0; i < nb; i++) 17 scanf("%d", &b[i]); 18 } 19 20 void game() { 21 int ap = 0, bp = 0; 22 int awin = 0, bwin = 0; 23 for (int i = 1; i <= n; i++) { 24 int res = a[ap] - b[bp]; 25 switch (res) { 26 case -2: 27 case -3: 28 case 5: 29 awin++; break; 30 case 2: 31 case 3: 32 case -5: 33 bwin++; break; 34 } 35 ap++, bp++; 36 ap %= na, bp %= nb; 37 } 38 if (awin == bwin) 39 printf("draw "); 40 else if (awin > bwin) 41 printf("A "); 42 else 43 printf("B "); 44 } 45 46 int main() 47 { 48 init(); 49 game(); 50 return 0; 51 }
D:买房子
描述
某程序员开始工作,年薪N万,他希望在中关村公馆买一套60平米的房子,现在价格是200万,假设房子价格以每年百分之K增长,并且该程序员未来年薪不变,且不吃不喝,不用交税,每年所得N万全都积攒起来,问第几年能够买下这套房子?(第一年年薪N万,房价200万)
输入
一行,包含两个正整数N(10 <= N <= 50), K(1 <= K <= 20),中间用单个空格隔开。
输出
如果在第20年或者之前就能买下这套房子,则输出一个整数M,表示最早需要在第M年能买下,否则输出Impossible。
样例输入
50 10
样例输出
8
#include <cstdio> #include <string> #include <algorithm> #include <stdlib.h> #include <set> using namespace std; const int maxn = 105; int n, k; void init() { scanf("%d%d", &n, &k); } void game() { int year = 1, flag = 0, sum = 0; double price = 200; for (; year <= 20; year++) { sum += n; if (sum >= price) { flag = 1; printf("%d ", year); break; } price = price * (double)(100 + k) / 100.0; } if (!flag) printf("Impossible "); } int main() { init(); game(); return 0; }
E:抓住那头牛
描述
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
5 17
样例输出
4
1 #include <cstdio> 2 #include <string> 3 #include <algorithm> 4 #include <stdlib.h> 5 #include <set> 6 #include<queue> 7 8 using namespace std; 9 10 const int maxn = 100005; 11 int n, k; 12 int visited[maxn]; 13 14 struct poi { 15 int x, step; 16 poi(int n,int m) :x(n),step(m) { } 17 }; 18 queue<poi> seek; 19 20 void init() { 21 scanf("%d%d", &n, &k); 22 } 23 24 void game() { 25 seek.push(poi(n,0)); 26 while (!seek.empty()) { 27 int now = (seek.front()).x,step= (seek.front()).step; 28 if (now == k) { 29 printf("%d ", step); 30 break; 31 } 32 seek.pop(); 33 if (now - 1 >= 0 && visited[now - 1] == 0) { 34 seek.push(poi(now-1,step+1)); 35 visited[now - 1] = 1; 36 } 37 if (now + 1 <= 100000 && visited[now + 1] == 0) { 38 seek.push(poi(now+1,step+1)); 39 visited[now + 1] = 1; 40 } 41 if (2*now <=100000 && visited[2*now] == 0) { 42 seek.push(poi(2 * now, step + 1)); 43 visited[2*now] = 1; 44 } 45 } 46 } 47 48 int main() 49 { 50 init(); 51 game(); 52 return 0; 53 }