sign(模拟)题解

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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米莱虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值