球魁
问题描述
A 十分喜欢打篮球,天天打球的他投篮百发百中,成为了学校的球魁,于是他开始嘲笑不会打球的 B。为了捍卫自己的尊严,B 进行了一个暑假的苦练,也达到了百发百中的投篮命中率,于是他向A 挑战,一场球魁争夺赛开始了。
他们打算用罚球线投篮计分的方式一决胜负,规则如下:
① 首先利用骰子的点数 n 来决定谁先投球,若是偶数,则 A 先投;若是奇数,则 B 先投。
② 比赛分为 r 轮,一人投一轮,轮流投篮。(例如:若A 先投,则第二轮 B 投,第三轮又轮到 A 投,依此类推,直至到第 r 轮结束)
③ 由于双方的投篮命中率都是百分百,所以每一轮他们都能投中,理论上投中一球得两分,但由于 A受今年篮球世界杯中国男篮的影响,他每次投球都有一个心情值 L,若 L 是素数,则他的得分仍为 2 分;特别地,当 L 为 11 时,他的得分变为 3 分;若 L 是合数,则他的得分变为 1 分,特别地,当 L 为 15 时,他的得分变为 0 分。而 B忙着打算法比赛没看世界杯,所以不受影响(即每一球均为两分)。
现在,他们找你作为裁判为他们计分,并判断谁赢得比赛,而身为软工的大学生,你准备写个程序,让程序来算。
输入
第一行输入两个整数 r (1≤r≤2000) 和 n (1≤n≤6),分别代表比赛的轮数和骰子的点数。
接下来输入一行,共 q 个正整数 L (2≤L≤100),用空格隔开。其中,q 代表 r 轮中 A 的轮数和,L 代表心情值。
说明:
若轮到 A 投篮,则输入一个心情值 L;若轮到 B 投篮,则无需输入。
例如,当 r=7,n=2r = 7, n = 2r=7,n=2 时,q 为 4。因为 A 先发球,则轮到 A投球的轮数有第一轮,第三轮,第五轮,第七轮,共四轮。
输出
输出一行,显示比赛结果:若是 A 赢,则输出 A wins.;若是 B 赢,则输出 B wins.;若是平局,则输出 equal.
解答
#include <stdio.h>
int main()
{
int r, n, q, p, L, lwh = 0, lzh = 0, i;
scanf("%d %d", &r, &n);
if(n%2 == 0)
{
if(r%2 == 0) q = r/2;
else q = (r + 1)/2;
}
else
{
if(r%2 == 0) q = r/2;
else q = (r - 1)/2;
}
p = r - q;
for(i = 1; i<=q; i++)
{
scanf("%d", &L);
if(L == 2||L == 3||L == 5||L == 7||L == 13||L == 17||L == 19||L == 23||L == 29||L == 31||L == 37||L == 41||L == 43||L == 47||L == 53||L == 59||L == 61||L == 67||L == 71||L == 73||L == 79||L == 83||L == 89||L == 97) lwh += 2;
else if (L == 11) lwh += 3;
else if (L == 15);
else lwh += 1;
}
lzh = p*2;
if (lwh>lzh) printf("A wins.");
else if (lwh<lzh) printf("B wins.");
else printf("equal.");
return 0;
}
总结
第一次这么长的代码一次性AC 0 debug(就目前这个阶段来说),有点小开心hhh。
这题题目思路很清晰了。
题源 : oj.socoding.cn