C - 赛尔逵传说

天天最近买了一台思维吃来玩赛尔逵传说。

赛尔逵传说需要玩家扮演近侍骑士森克从恶魔噶里嗷的手里救下赛尔逵公主。但是救出公主的路途异常艰险,噶里嗷在去城堡的路途上设置了 nn 只怪兽来阻挡森克,这 nn 只怪兽分别编号从 11 到 nn。其中第 ii 只怪兽血量为 d_idi​ 攻击力为 x_ixi​。

已知森克的攻击力为 kk,他将按顺序轮流与这些怪兽进行若干次回合制战斗。在回合制战斗中,被攻击者会损失攻击者攻击力大小的血量,当被攻击者血量掉到 00 及以下就会立即死亡。每个回合都由森克主动对怪兽发起一次攻击(森克始终先手攻击怪兽),如果怪兽尚未死亡,那么它在本回合就会立即反击森克一次,即森克被攻击后损失该只怪兽攻击力大小的血量,如此循环直到其中某一战斗方死亡为止。

森克为了确保能救出公主,提前准备了 cc 份"力量炖水果",每份"力量炖水果"都可以在瞬间吃下并使森克本回合临时增加 kk 点攻击力,而且一回合内森克可以连续吃许多份"力量炖水果"。请问,森克如果想要救下赛尔逵公主的话,最少需要消耗多少血量呢?

思路:当血量小于等于k的时候不用管,当他大于k的时候我们把他存入piar类型的数组里,我们需要先消灭攻击力大的才能保证我们受到的攻击量小,所以我们存入之后按攻击力从大到小排序,先把水果用在攻击力大的怪兽身上,这样计算攻击力。

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;
typedef long long ll;
const ll N=100005;
pair<ll,ll> q[N];
int n,k,c;
int main(){
	cin>>n>>k>>c;
	ll ans=0;
	ll a,b;
	for(ll i=0;i<n;i++){
		cin>>a>>b;
		if(a>k){//如果血量大于攻击力就存入数组中
			q[ans++]={b,a};//因为pair排序的时候是按first排序所以把攻击力存在first
		}
	}
	ll con=0;//记录总被攻击量
	ll idx=-1;//记录一下到哪c为0
	sort(q,q+ans,greater<pair<ll,ll> > ());
	for(ll i=0;i<ans;i++){
		ll tmp=q[i].second/k;
		if(q[i].second %k!=0)tmp++;
		tmp--;//算出杀死他需要的水果数
		if(tmp<=c){//如果比份数小的话份数减一下
			c-=tmp;
		} else{//如果比份数大的话记录一下当前的下标,血量减之后再加一下这一轮被攻击的数
			idx=i;
			q[i].second -=(c+1)*k;
			con+=q[i].first ;
			break;
			
		}
	}
	if(idx!=-1){//当有水果被用完但是没有消灭完的情况时
		for(ll i=idx;i<ans;i++){
		ll p=q[i].second /k;//计算要消灭他需要几次攻击
		if(q[i].second %k==0)p--;//如果当这个被整除的时候次数--
		con+=q[i].first *p;
	}
	}
	cout<<con;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值