贪心有相当一部分是根据某个标准进行排序:猜想的能力比较重要。猜想之后,进行数学推导证明。
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会爆