一,题目:
HBU最近在进行花美男的选举,候选人是A同学和B同学。
HBU一共有n个学院,其中第i个学院有ai名同学支持A同学,bi名同学支持B同学。
但是,B同学可以在每个学院发表演讲来获得更多的同学对他的支持。
如果B同学在某个学院进行了一场演讲,那么这个学院的全部同学都会支持他,包括原来支持A同学的那些同学。
相反,如果B同学不在某个学院发表演讲,那么这个学院中原来支持A同学的那些同学还会支持A同学,但是那些原来支持B同学的同学们将不再支持B同学,他们会变的中立——谁也不支持。
请你求出B同学最少在几个学院发表演讲才能让支持他的同学人数超过支持A同学的人数。
输入格式
第一行一个正整数n。
后面n行,每行两个正整数(ai,bi),分别代表第i个学院中支持A同学的人数和支持B同学的人数。
1≤n≤2×1e5
1 ≤ai,bi≤1e9
输出格式
请输出答案
测试样例一
4
2 1
2 2
5 1
1 3
1
说明:如果B同学在第三个学院发表演讲的话,支持A同学的人数将变为5人,支持B同学的人数将变为6人,满足条件。
测试样例二
5
2 1
2 1
2 1
2 1
2 1
3
测试样例三
1
273 691
1
二,思路:
对于这题排序大家应该都想的到,但是该按怎样的循序来排序,是有点难想的。如果排序条件,无法直接看出来的化,最好利用数学推导一下(最好不要想当然),因为数学是严谨的。以下是我的推导过程。
由上图可知,当2*ai+bi越大,我们就会选的越少。故我们可以自定以下排序规则。
三,代码:
#include <iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<set>
#include<stack>
#include<queue>
#include<map>
using namespace std;
#define x first
#define y second
const int N=2e5+10,M=1e9+7;
typedef long long ll;
typedef pair<int,int> pii;
struct Node{
ll a,b;
}arr[N];
//自定义排序规则
bool cmp(Node v,Node w){
if(2*v.a+v.b!=2*w.a+w.b) return 2*v.a+v.b>2*w.a+w.b;
return false;
}
void Solved() {
int n;
cin>>n;
//先算出A的初始人数
ll suma=0;
for(int i=1;i<=n;i++){
int a,b;
cin>>a>>b;
arr[i]={a,b};
suma+=a;
}
sort(arr+1,arr+1+n,cmp);
//表示我们选择的支持B人数和
ll sumb=0;
//选择了几个学院
int flag=-1;
for(int i=1;i<=n;i++){
sumb+=arr[i].a+arr[i].b;
suma-=arr[i].a;
if(sumb>suma){
flag=i;
break;
}
}
cout<<flag<<endl;
}
int main()
{
int t;
t=1;
while(t--) {
Solved();
}
return 0;
}