欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

未了 NOI online2 T1题解

程序员文章站 2024-03-17 16:04:52
...

前言

考试时还以为能得点分呢。。。
传送门
根据题目,不难看出这是一道贪心题
我们把所有的魔法从高处往地处的使用,再求一个前缀和,就是使用到该魔法时西西弗斯需要用的年份,如果最高的魔法( 它的前缀和就是所有魔法都使用后西西弗斯需要花费的时间)使用了之后还是不能让西西弗斯大于tit_i年到达,就输出-1,反之,就在所有魔法中查找最小花费
注意:本题需要用到二分查找(其实就是个板子。。。)
特殊:如果西西弗斯按照没有阻拦的速度都无法在tit_i年内到达山顶,直接输出0

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
double b[200001],l,q,t,v,a[200001];
long long n;
int cmp(double x,double y){
	return x>y;
}
int main(){
	cin>>n>>l>>v;
	for (int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+1+n,cmp);//排序魔法的“能力”
	b[0]=l/v;//最好情况是不使用魔法
	for (int i=1;i<=n;i++){
		b[i]=double(a[i])/v+b[i-1];
	}
	scanf("%d",&q);
	while (q--){
		cin>>t;
		if (b[n]<=t){//如果用上所有魔法都不满足要求
			printf("-1\n");
			continue;
		}
		int l=0,r=n,ans=0;
		while (l<=r){
			int mid=(l+r)>>1;//相当于mid=(l+r)/2
			if (b[mid]>t){//如果大于了t,寻找花费更小的方案
				ans=mid;
				r=mid-1;
			}else{//如果还不能够让西西弗斯在大于t年时间走完
				l=mid+1;//往更长的时间找
			}
		} 
		printf("%d\n",ans);
	}
	return 0;
}