您的位置:首页 > 其它

USACO月赛题解 第四讲 贪心

2014-02-06 12:59 225 查看
汇总见 http://blog.csdn.net/qyl916/article/details/12442283

这一部分的题目也很经典,虽然是一次排序解决问题,但有难度

第15题 奶牛杂技 acrobat

这种题基本上要按某种关键字排序,所以考虑相邻两头牛,他们上面的牛重量加起来是w0,若A在B上面,A受到压力为w0 - sA B受到压力为 w0 + wA - Sb.再写出反过来的情况,进行一下分析即可,最后是按W+S排序。据说把未经分析的带max的式子直接作为关键字排序也行。

struct node{
int w,s;
};
int cmp(node a, node b){
return a.w + a.s < b.w + b.s;
}
node a[50010];
int n;
int main()
{
scanf("%d", &n);
rep1(i, n){
scanf("%d%d", &a[i].w, &a[i].s);
}
sort(a + 1, a + n + 1, cmp);
LL ans = -INF, now = 0;
rep1(i, n){
ans = max(ans, now - a[i].s);
now += a[i].w;
}
printf("%lld\n", ans);//while(1);
return 0;
}

第16题 两道工序 mqueue
直接分析相邻两头牛,然后把较复杂的式子作为关键字排序就能A了,排序关键字是

return a.fi + b.se + max(a.se, b.fi) < a.se + b.fi + max(a.fi, b.se); 。。。

/*
开始感觉是按第一项工作时间排序,造出了反例
感觉是按第一道减第二道排序,写写看
又找到反例 .. 但反例找错了。。
看题解
max(AD + BD + BC, AD + AC + BC) <=
max(AC + BC + BD, AC + AD + BD)
<=>
min(BD, AC) > min(AD, BC)
这句不懂
但再后面的关键字处理用不着,可以直接A
其实看不懂的这步也不用,直接比就行了,常数都没有影响
*/
using namespace std;

struct node{
int fi, se;
};
bool cmp(node a, node b){
return a.fi + b.se + max(a.se, b.fi) < a.se + b.fi + max(a.fi, b.se);
}
node a[30000];
int n, s[30000], t[30000];
int main()
{
scanf("%d", &n);
rep1(i, n) scanf("%d%d", &a[i].fi, &a[i].se);
sort(a + 1, a + n + 1, cmp);
//rep1(i, n) printf("%d %d\n", a[i].fi, a[i].se);
s[0] = t[0] = 0;
rep1(i, n) {
s[i] = s[i - 1] + a[i].fi;
t[i] = max(t[i - 1], s[i]) + a[i].se;
}
printf("%d\n", t
);
//while(1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: