1300*C. Slay the Dragon

Example

input

复制代码
4
3 6 2 3
5
3 12
7 9
4 14
1 10
8 7

output

复制代码
1
2
4
0
2

解析:

题意是选一个人去攻击龙,其余人防守龙,可以花费 x 块钱让某英雄能力 +x,问最少的花费是多少。

贪心,选择大于龙的防御力并且最小的那个英雄去攻击(不存在就选择最大的英雄)

二分得出这个英雄,同时和其左侧相邻的英雄比较,花钱少的即为答案。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll n,a[N],t,sum,x,y;
int main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]),sum+=a[i];
	sort(a+1,a+n+1);
	scanf("%lld",&t);
	while(t--){
		ll cnt1=0,cnt2=0;
		scanf("%lld%lld",&x,&y);
		int l=1,r=n;
		while(l<r){		//找出第一个大于等于x的英雄去攻击 
			int mid=l+r>>1;
			if(a[mid]>=x) r=mid;
			else l=mid+1;
		}
		if(a[l]<x) cnt1+=x-a[l];
		if(y-sum+a[l]>0) cnt1+=y-sum+a[l];
		if(l==1){		//如果a[l]是最小值,则cnt1就是答案 
			printf("%lld\n",cnt1);
			continue;
		}
		if(a[l-1]<x) cnt2+=x-a[l-1];	//否则,计算 l 左边相邻的值去攻击 
		if(y-sum+a[l-1]>0) cnt2+=y-sum+a[l-1];
		printf("%lld\n",min(cnt1,cnt2));	//答案即为 l-1和 l两个人花费的较小值 
	}
	return 0;
}
相关推荐
谭欣辰44 分钟前
C++ 控制台跑酷小游戏
c++·游戏
周末也要写八哥1 小时前
C++实际开发之泛型编程(模版编程)
java·开发语言·c++
CS_Zero2 小时前
无人机路径规划算法——EGO-planner建模总结—— EGO-planner 论文笔记(一)
论文阅读·算法·无人机
杰梵2 小时前
聚酯切片DSC热分析应用报告
人工智能·算法
兵哥工控2 小时前
MFC中return和break用法示例
c++·mfc
@BangBang2 小时前
leetcode (4): 连通域/岛屿问题
算法·leetcode·深度优先
Ulyanov2 小时前
像素迷宫:路径规划算法的可视化与实战
大数据·开发语言·python·算法
Mr_pyx2 小时前
【LeetCode Hot 100】 除自身以外数组的乘积(238题)多解法详解
算法·leetcode·职场和发展
Trouvaille ~2 小时前
零基础入门 LangChain 与 LangGraph(五):核心组件上篇——消息、提示词模板、少样本与输出解析
人工智能·算法·langchain·prompt·输入输出·ai应用·langgraph
2401_841495643 小时前
Linux C++ TCP 服务端经典的监听骨架
linux·网络·c++·网络编程·ip·tcp·服务端