sign(模拟)题解
UPC 2020春季混合个人赛第七场
题目:问题 D: sign
时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
众所周知,xz沉迷于炉石不可自拔,然而因为他总是伏笔,引得chr频频拍案叫绝。
已知xz和对手场上各剩下了一只怪,xz的怪血量为a, 攻击力为b,对手的怪血量为c,,攻击力为d。两只怪会相互攻击,每次攻击怪物都会互相失去与对方的攻击力等值的血量,当有一只怪血量小于等于0时视为死亡(可能同时死亡)。xz想知道当场上还剩一只怪的时候怪的血量是多少,如果此时场上没有怪物时则输出0。
输入
一行输入四个整数a, b, c, d为题目描述下的意义;
输出
输出共一行一个正整数,为场上剩下的怪的血量。
样例输入 1
12 4 6 5
样例输出 1
2
样例输入 2
101 50 100 50
样例输出 2
1
样例输入3
100 50 100 50
样例输出 3
0
提示
样例解释
第一次攻击后xz的怪受到了5点伤害,还剩7血,对手的怪受到了4点伤害,还剩2血
第二次攻击后xz的怪受到了5点伤害,还剩2血,对手的怪受到了4点伤害,血量低于0,战斗结束。
【数据范围】
对于60%的数据0≤a,b,c,d≤100000
对于100%的数据0≤a,b,c,d≤10^18(暴力无解),保证a,c≠0且b+d≠0
注意分类不要漏情况就行了,这类题目可以结合不等号的分类和实际情况,要自己举一些特例跑一遍,防止多W。下面附代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a,b,c,d,t;
int main(){
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
//血少于1次伤害的情况,包括输出 0
if(d>=a){
if(c-b<=0) cout<<0<<endl;
else cout<<c-b<<endl;
return 0;
}
if(b>=c){
if(a-d<=0) cout<<0<<endl;
else cout<<a-d<<endl;
return 0;
}
ll x=a/d,y=c/b;
t=min(x,y); //记录较小次数
//血能承受多次伤害的情况
ll p=a-d*t,q=c-b*t;
if(p<=0 && q<=0) cout<<"0"<<endl;
else if(p<=0 && q>0) cout<<q<<endl;
else if(p>0 && q<=0) cout<<p<<endl;
else if(p>0 && q>0){
p-=d;q-=b;
if(p<=0 && q<=0) cout<<"0"<<endl;
else if(p<=0 && q>0) cout<<q<<endl;
else if(p>0 && q<=0) cout<<p<<endl;
}
return 0;
}