思路:
一开始选手A的票数是a数组之和,选手T的票数是0(当他没有去任何城市)。
当T去一个城市之后,这个城市A的票和T的票都归T。因此两者之间的差距会缩小2a+b。
我们需要最快的方式,令两者的票数差距缩小,因此每次选2a+b最大的城市。
错误思路:当时我就简单第把a+b和b的值排序。结果这不是最优的贪法。虽然例子没有想出来,哪位大神可以帮我想一想???可以帮我写在评论~~~!!!非常感谢
时间复杂度:O(nlogn)
参考代码如下
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
vector<int> vc;
signed main(){
#ifndef ONLINE_JUDGE
freopen("tpl.txt","r",stdin);
#endif
cin >> n;
int res = 0,diff = 0;
for(int i = 0 ; i < n ; i++){
int a,b; cin >> a >> b;
diff += (-a);
vc.push_back(2*a + b);
}
// cout << diff << endl;
sort(vc.begin(),vc.end());
for(int i = n-1 ; i >= 0 && diff <= 0; i--){
diff += vc[i];
// cout << diff << endl;
res++;
}
cout << res << endl;
return 0;
}