尖塔游戏:二分答案
在尖塔游戏中,你会遇到n个敌人。第i个敌人会对你造成ai点伤害。如果在某一次战斗中,敌人给你造成伤害后,你的剩余生命值小于等于零,则你在这次战斗中被击败,否则你就击败了这个敌人。
除此之外,你拥有k瓶强力药水,每瓶强力药水能够帮助你在一次战斗中免收任何伤害(仅限于这一次战斗)。
请问你在游戏中合理使用强力药水时,最多能击败多少个敌人。
输入描述
第一行一个正整数T,表示有T组数据。
每组数据的第一行包含三个整数n,m,k,分别表示敌人的数量,你的初始生命值以及你拥有的强力药水的数量。
接下来一行包含n个正整数,其中第i个正整数ai表示第i个敌人造成的伤害。
输出描述
对于每组数据输出一行,表示最多能击败的敌人数量。
思路:每次二分,对伤害值前k大的敌人使用药水,接受剩下的伤害,若血量>0,则满足条件。
#include<bits/stdc++.h>
using namespace std;
int t,n,m,k,a[100010],p[100010];
long long ck(int x){long long s=0;memcpy(p,a,sizeof p);sort(p+1,p+x+1);for(int i=1;i<=x-k;i++)s+=p[i];return s;
}
void solve(){int l=0,r=n,ans;while(l<=r){int mid=(l+r)/2;if(ck(mid)<m){ans=mid;l=mid+1;}else r=mid-1;}cout<<ans<<" "<<endl;
}
int main(){cin>>t;while(t--){cin>>n>>m>>k;for(int i=1;i<=n;i++){cin>>a[i];}solve();}
}