codeforces 1574 C. Slay the Dragon

在这里插入图片描述
屠龙,首先要派一个人攻击力至少等于龙防御力的,然后剩下的人所有攻击力要加起来小于龙攻击力来防御(因为你也不知道是不是你的屠龙勇士是不是去的路上自己家被偷了)
看范围是1e5,那么坑定是排序二分什么的了。
对于一条龙,我们可以选一个最接近它防御的人去斩它,其他剩下的人防御
那么我们可以对数组排序,然后二分查找最接近的人。

#include<bits/stdc++.h>
#define int long long
#define Endl '\n'
#define endl '\n'
#define x first
#define y second
#define pi pair<int ,int>
#define pb push_back

using namespace std;

inline int read(){
   int s=0,w=1;
   char ch=cin.get();
   while(!isalnum(ch)){if(ch=='-')w=-1;ch=cin.get();}
   while(isdigit(ch)) s=s*10+ch-'0',ch=cin.get();
   return s*w;
}

signed main()
{
 	cout<<fixed<<setprecision(0);
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n=read();
	int a[200005];
	int total=0;
	for(int i=0;i<n;i++)
	{
		a[i]=read();
		total+=a[i];
	}
		
	sort(a,a+n);//多组数据外排序
	int t=read();
	while(t--)
	{
		int de=read(),at=read();
		int it=upper_bound(a,a+n,de)-a;//upper——bound,algorithm库函数二分查找坐标
		if(it==n)//特判是不是没有大于它的勇士
		{
			cout<<de-a[n-1]+max(0ll,at-total+a[n-1])<<endl;
			continue;
		}
		int co1=LLONG_MAX,co2=LLONG_MAX;/*应该是有规律选最接近他的
										(大于等于或小于它二选一)
										懒得思考了,取最小,多不了几秒*/
		co1=max(0ll,at-total+a[it]);
		if(it>0)//无论什么时候都要防止数组越界
		co2=max(0ll,de-a[it-1]+max(0ll,at-total+a[it-1]));
		cout<<min(co1,co2)<<endl;
		
	}
	
	
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值