P7891 [入门赛 #10] Coin Selection G(hard version) 题解
_GeorgeAAAADHD_ · · 题解
注:本题作者使用二分算法。
感谢 @zhuweiqi 指出重大错误。
题目大意:
给定
总共执行
数据范围:
分析:
暴力枚举是
于是我们思考一下二分的做法。
发现将 sort(a.begin(),a.end());。
然后我们用一个 vector 存储所有 vector,每次操作后将要删除的 iterator,即迭代器,可以自行上网搜索。
于是我们便愉快地 AC 了本题。
注:int 范围,因此我们要开 long long。
Code:
#include<bits/stdc++.h>
using namespace std;
long long n,suma=0,sumb=0,k;
bool f=1;
vector<long long> a;
void add(long long &sum){
int l=0,r=a.size()-1,ans=0,x=0;
while(l<=r){
int mid=(l+r)/2;
if(a[mid]<=sum){
x=mid;
ans=a[mid];
l=mid+1;
}
else r=mid-1;
}
if(!ans){
sum+=a[0];
a.erase(a.begin());
}
else{
sum+=a[x];
a.erase(a.begin()+x);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>k;
a.push_back(k);
}
sort(a.begin(),a.end());
for(int i=1;i<=n;i++){
if(f)add(suma);
else add(sumb);
f=!f;
}
cout<<suma<<' '<<sumb;
}