贪心有相当一部分是根据某个标准进行排序:猜想的能力比较重要。猜想之后,进行数学推导证明。

P1842 [USACO05NOV] 奶牛玩杂技 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

贪心:每次最优,结果最优。

考虑牛的两个性质,数学推导出排序原理,按照排序原理结合简单的不等式、累加解题。

一、sort对pair的排序,较为简洁:

#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef pair<int,int> PII;
const int N = 50010;
int n;
PII cow[N];//pair类型数组
int main(){
	cin>>n;
	for(int i = 0; i<n; i++){
		int w, s;
		cin>>w>>s;
		cow[i] = {w+s, w};
	}
	sort(cow, cow+n);//sort对pair默认按照first升序排列 
	int res = -2e9, sum = 0;//所求系数、 
	for(int i = 0; i<n; i++){
		int w = cow[i].second, s = cow[i].first - w;
		res = max(res, sum - s);
		sum += w;
	}
	cout<<res;
	return 0;
}

二、也可使用结构体存储;重载运算符排序:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 50010;
struct Cow{
	int w, s;
	bool operator< (const Cow &t) const{
		return w+s < t.w + t.s;
	}
}cow[N];
//重载写法二
//bool operator<(node &t){
//    return w+s<t.w+t.s;
//}
int main(){
	int n;
	cin>>n;
	for(int i = 0; i<n; i++){
		cin>>cow[i].w>>cow[i].s;
	}
	sort(cow, cow+n);
	int res = -2e9, sum = 0;//初始值设为负无穷 
	for(int i = 0; i<n; i++){
		res = max(res, sum-cow[i].s);
		sum += cow[i].w;
	} 
	cout<<res;
	return 0;
}

P1080 [NOIP2012 提高组] 国王游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

按照每组两个书的乘积升序排序,结果最优

本题计算乘积、商int会爆

A32 贪心算法 P1080 [NOIP2012 提高组] 国王游戏 - 董晓 - 博客园 (cnblogs.com)