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