USACO月赛题解 第四讲 贪心

汇总见 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[n]);
	//while(1);
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值