思路:利用贪心,不能在两个最大的陷阱位置解决问题,那一定不能再任意其他的两个陷阱解决,所以通过倒这来(由大到小),最后通过二分判断位置 代码:
#include #include #include #include #include using namespace std; typedef long long int ll; typedef pair P; const int maxn=200100; const int INF=pow(2,31)-1; const int maxm=5e4+5; const int mod=1000000007; ll n,l,v; ll a[maxn]; ll q; map mp; ll dp[maxn]; int main(){ scanf("%lld%lld%lld",&n,&l,&v); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } sort(a+1,a+1+n); scanf("%lld",&q); ll s=(ll)(l*1.0/v+0.5); ll mi=l; ll k=0; dp[k]=s; for(int i=n;i>=1;i--){ mi+=a[i]; k++; ll s1=(ll)(mi*1.0/v+0.5); dp[k]=s1; } while(q--){ ll x; scanf("%lld",&x); if(x>=dp[n]){ printf("-1n"); continue; } ll ks=upper_bound(dp,dp+k,x)-dp; if(ks<=n){ printf("%lldn",ks); }else{ printf("-1n"); } } return 0; }
其他题目:题目链接
上一篇 元基花数据计算api 已经 打包 jar, git已经备份
下一篇 tcc-transaction源码详解
版权所有 (c)2021-2022 MSHXW.COM
ICP备案号:晋ICP备2021003244-6号