这类贪心问题就是找到一个前后关系的等式,然后在化简的时候是一定会把关键变量消去的,就只和这两个元素的性质有关,和前面的所有元素都无关,一般步骤如下:
- 先假定一个前后顺序,将其作为正确的
- 依照这个顺序列出关系式
- 化简后的到一个式子
- 写入cmp,用sort排序
- 求解
下面是3个例题:
解法:
假定其中的两个元素(机器人)是pq,设下面两个顺序的准确性是这样的:
————pq———— ✅ ————qp———— ❌
那么:qa(pa*x+b)+qb > pa(qa*x+qb)+pb
得到: qa*pb+qb > pa*qb+pb
#include <iostream>
#include <algorithm>
using namespace std;
struct robot {
int a,b;
}rb[22];
bool cmp(robot x,robot y) {
return y.a*x.b+y.b>x.a*y.b+x.b;
}
void pt(__int128 a) {
if(a>9) pt(a/10);
putchar(a%10+'0');
}
int main() {
int n,x;
cin>>n>>x;
for(int i=0;i<n;i++)
cin>>rb[i].a>>rb[i].b;
sort(rb,rb+n,cmp);
__int128 result=x;
for(int i=0;i<n;i++) {
result=rb[i].a*result+rb[i].b;
}
pt(result);
}
解法:∏是前面大臣左手累乘∑
————pq———— ✅ ————qp———— ❌
那么:
p: ∏/pr ① ∏*ql/pr ③
q: ∏*pl/qr ② ∏/qr ④
有: max(1,2) <= max(3,4)
但: 1<3 && 2>4
必须有: 2<3
即: ∏*pl/qr < ∏*ql/pr
得到: pl*pr < ql*qr
解法:∑是已用的时间和
————pq———— ✅ ————qp———— ❌
那么:
p: (∑+tp)*dp (∑+2*tq+tp)*dp
q: (∑+2*tp+tq)*dq (∑+tq)*dq
有:(∑+tp)*dp + (∑+2*tp+tq)*dq < (∑+2*tq+tp)*dp + (∑+tq)*dq
得: tp*dq < tq*dp