第二届上海市青少年算法竞赛(小学组)
题目描述 Description
小爱和小艾两人组队打一只怪兽。一开始怪兽有 n 点生命值,当 n 变成 0 或更低时,怪兽就被消灭了。他们两人是同时开始攻击的,小爱每分钟可以攻击 a 下,小艾每分钟可以攻击 b 下。若 a=2,b=4,则小爱发出攻击的时刻为
0.5, 1, 1.5, 2, 2.5, ⋯
小艾发出攻击的时刻为
0.25, 0.5, 0.75, 1, 1.25, 1.5, ⋯
攻击分两种类型,普通攻击每次对怪兽造成 1 点伤害。若在某时刻,小爱和小艾恰好一同发出攻击,称为爆击,爆击将对怪兽造成成倍的伤害,共计 (1+1)×2=4 点伤害。
一旦攻击开始,就不会中断,直到怪兽被消灭为止,请问,对怪兽造成最后一点伤害的是哪一位玩家?如果最后一击是两人同时造成的,输出 C(Combo的意思)。
输入描述 Input Description
第一行:一个正整数表示 n。
第二行:两个正整数表示 a 与 b。
输出描述 Output Description
1.若是小爱发出了最后一击,输出 A;
2.若是小艾发出了最后一击,输出 B;
3.若是两人的爆击为最后一击,输出 C。
样例输入 Sample Input
输入样例1: 40 3 5 ---------- 输入样例2: 33 3 5
样例输出 Sample Output
输出样例1: C ---------- 输出样例2: B
数据范围及提示 Data Size & Hint
数据范围提示:
对于 50% 的数据,1≤n≤100,1≤a,b≤10;
对于 100% 的数据,1≤n≤20000000,1≤a,b≤40000;
代码:
#include<iostream>
using namespace std;
int n,a,b;
int ap=0;
int bp=0;
int main() {
cin>>n>>b>>a;
while (n>0){
if (ap+a<bp+b){
ap+=a;
n--;
}else if(ap+a>bp+b){
bp+=b;
n--;
}else {
ap+=a;
bp+=b;
n-=4;
}
if(ap>1e9&&bp>1e9){
ap-=1e9;
bp-=1e9;
}
}
if (ap>bp){
cout<<"A";
}else if (bp>ap){
cout<<"B";
}else{
cout<<"C";
}
return 0;
}
没事干压缩一下:
#include<iostream>
using namespace std;int n,a,b;int ap=0;int bp=0;int main() {cin>>n>>b>>a;while (n>0){if (ap+a<bp+b){ap+=a;n--;}else if(ap+a>bp+b){bp+=b;n--;}else {ap+=a;bp+=b;n-=4;}if(ap>1e9&&bp>1e9){ap-=1e9;bp-=1e9;}}if (ap>bp){cout<<"A";}else if (bp>ap){cout<<"B";}else{cout<<"C";}return 0;}