概述
天天最近买了一台思维吃来玩赛尔逵传说。
赛尔逵传说需要玩家扮演近侍骑士森克从恶魔噶里嗷的手里救下赛尔逵公主。但是救出公主的路途异常艰险,噶里嗷在去城堡的路途上设置了 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;
}
最后
以上就是清新马里奥为你收集整理的C - 赛尔逵传说的全部内容,希望文章能够帮你解决C - 赛尔逵传说所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复