ac

root  •  2年前


#include <bits/stdc++.h>//听说你们都看不懂这道题的代码,我来科普一波; 
#define rep(i,n) for(int i=1;i<=n;i++)//定义rep实际就是从一到 n的循环,其实就是把for循环重命名了; 
using namespace std;
struct l{
int x,y;//x代表影响力,y代表承受力; 
}k[500010];//按照题目所给数据值; 
bool cmp(l a,l b){//1和0相当于true和false,true表示位置不变,false表示交换位置; 
if(a.x+a.y<b.x+b.y)return true;//3;
if(a.x+a.y>b.x+b.y)return false;//输入:10 3 输出: 3 3;
if(a.x<b.x)return true;//输入:输出:2 5 2 5;//如果他们相等就比较影响力的大小; 
return false;//输入:3 3 输出:10 3;
}//为什么这样排其实就是比较把受到的伤害从小到大排序罢了; 
int main(){
int n;
cin>>n;//输入人数; 
rep(i,n){//等价 for(int i=1;i<=n;i++);
	cin>>k[i].x>>k[i].y;//输入每个人的影响力和承受能力; 
}
sort(k+1,k+n+1,cmp);//按照cmp自定义排序规则排序; 
int tot=0,ans=-200000000;//因为需要用max函数,所以ans要赋极小值,避免有负数出现; 
rep(i,n){//等价 for(int i=1;i<=n;i++);
//把样例数据1排序之后这样看;
//10 3 i=1;tot-k[i].y=3+k[i-1].x-3=3+2-3=2;
//2 5 i=2; tot-k[i].y=0+k[i-1].x-5=3-5=-2;
//3 3 i=3; tot-k[i].y=0-3=-3;
  ans=max(ans,tot-k[i].y);//取最大值; 
  tot+=k[i].x;//tot每次加上此人的承受力; 
}
cout<<ans<<'\n';//输出答案并换行; 
return 0;//好习惯; 
}//说实话像我这么良心的人,真的没有几个了;

评论:

请先登录,才能进行评论