18.6.27 水题整理(2)--2nd 上机

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 }
View Code

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;
}
View Code

E:抓住那头牛

描述

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:

1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
 
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?

 

输入

两个整数,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 }
View Code
注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
原文地址:https://www.cnblogs.com/yalphait/p/9234260.html