给定一个数组,有若干次询问。对于每次询问,输入
一道有点难的贪心、二分、排序。建议难度 普及。
输入数组后,进行排序。
对于每一个
记 lower_bound(a, a+n, x)-a。
令 a[k]
的总和。如果
需要分情况考虑。
假设取英雄
假设取英雄
只要输出上面两种情况的较小值就可以了。
按照贪心思想,我们要选攻击力最大的英雄来打龙。
先计算出 y-s+x-a[maxi]。
否则,只需要花费英雄的金币,就是
x-a[maxi]。
必须按照下面的内容优化,否则会超时!
使用 inline 内联函数可以提高函数调用效率。
预处理过后,就不必反复循环计算了。
就是这三条语句:
xxxxxxxxxxios_base::sync_with_stdio(false);cin.tie(0); cout.tie(0);千万不要抄,小心棕名!
xxxxxxxxxx// 1574C Slay the Dragonusing namespace std;
var totalsum;inline var getsumWithout(var a[], var n, var k){ return totalsum-a[k];}
int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); var n; cin>>n; var a[n]; var maxi=0; for(var i=0; i<n; i++) cin>>a[i], totalsum+=a[i]; sort(a, a+n); maxi=n-1; var T; cin>>T; while(T--) { var x, y; cin>>x>>y; var k=lower_bound(a, a+n, x)—a; if(k==0) { var s=getsumWithout(a, n, k); if(s<y) cout<<y-s<<endl; else cout<<0<<endl; continue; } if(k!=n) { var res1; { var s=getsumWithout(a, n, k); if(s<y) res1=y-s; else res1=0; } var res2=x-a[k-1]; { var s=getsumWithout(a, n, k-1); if(s<y) res2+=y-s; } cout<<min(res1, res2)<<endl; } else { var s=getsumWithout(a, n, maxi); if(s<y) cout<<y-s+x-a[maxi]<<endl; else cout<<x-a[maxi]<<endl; } }
return 0;}
All Rights Reserved 2022 Wang Zhanrui