POJ - 3045 Cow Acrobats 贪心

题目大意:有N头牛要叠罗汉,每头牛都有相应的重量和力量。

叠罗汉是有危险的,每头牛的危险系数为该牛上面的牛的重量的和减去该牛的力量

问如何安排这个叠罗汉顺序,使得危险系数最大的那头牛的危险系数最小

解题思路:最大值的最小值,用二分?二分当然也可以,但是有更简便的方法

假设第i头牛的重量为wi,力量为si,第j头牛的重量为wj,力量为sj,第i头牛上面的牛的重量和sum

先考虑第一种情况,第i头牛叠到第j头牛的上面

那么 a1 = sum -si, b1 = sum + wi -sj

考虑第二种情况,第j头牛叠到第i头牛的上面

那么 a2 = sum - sj, b2 = sum + wj -si

先来考虑一下b1大于b2的情况

如果b1 > b2,那么wi + si > sj + wj

反之,如果b2 > b1那么 wj + sj > si + wi了

1.先假设 a1 > b1,那么可得sj > si + wi,b2 > a1 > b1 > a2,所以选择第一种叠法

同理可得 a2 > b2 时,si > sj + wj,选择第二种叠法

2.假设 a2 < a1, 因为b2 > a1, b1 > a2,所以这种情况下只需要判断是b1大还是b2大就可以了

最后可得到结论,当si + wi > sj + wj 时,就选择第二种叠法,反之,选择第一种叠法

也就是说,叠是根据si + wi的和决定的,越大就越下面

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 50010
struct Cows{
    int W, S;
}C[maxn];
int N;

bool cmp(const Cows a, const Cows b) {
    if(a.S + a.W == b.S + b.W)
        return a.W < b.W;
    return a.S + a.W < b.S + b.W;
}
void init() {
    for(int i = 0; i < N; i++)
        scanf("%d%d", &C[i].W, &C[i].S);
    sort(C, C+N, cmp);
}

long long solve() {
    long long Sum = 0, Max = -0x3f3f3f3f;
    for(int i = 0; i < N; i++) {
        Max = max(Sum - C[i].S, Max);
        Sum += C[i].W;
    }
    return Max;
}

int main() {
    while(scanf("%d", &N) != EOF) {
        init();
        printf("%lld\n",solve());
    }
    return 0;
}
时间: 2024-10-11 06:32:59

POJ - 3045 Cow Acrobats 贪心的相关文章

POJ 3045 Cow Acrobats (想法题)

题目链接:POJ 3045 Cow Acrobats 题意:有n只牛叠罗汉,危险指数的计算是 该层牛以上的牛重量总和减去这层牛的强度,求使最大的危险指数中的最小值. 思路:根据w+s排序,最大的在最下面,道理很简单,危险指数: sum-(w+s),(sum该层牛以上的牛重量总和). AC代码: #include<stdio.h> #include<string.h> #include<algorithm> #define ll __int64 using namespa

poj 3045 Cow Acrobats(数学题)

题目链接:http://poj.org/problem?id=3045 Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the circus. Their hoofed feet prevent them from tightrope walking and swinging from the trapeze (and their last

poj 3045 Cow Acrobats(二分搜索?)

Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the circus. Their hoofed feet prevent them from tightrope walking and swinging from the trapeze (and their last attempt at firing a cow out of a ca

POJ 3045 Cow Acrobats

传送门:http://poj.org/problem?id=3104 题意: 烘干所有的衣服,在自然晾干每分钟可以减少1单位的水分,在烘干机里面每分钟减少k单位的水分, 一件衣服可以烘干一部分水分,也可以自然晒干一部分水分. 解题思路: 在代码中. 实现代码: #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int MAXN=100000; con

POJ 3045 Cow Acrobats (最大化最小值)

题目链接:click here~~ [题目大意] 给你n头牛叠罗汉.每头都有自己的重量w和力量s,承受的风险数rank就是该牛上面全部牛的总重量减去该牛自身的力量,题目要求设计一个方案使得全部牛里面风险最大的要最小. [解题思路]:依照w+s贪心放置,越大的(注意是w+s之和)越在以下.不难证明:假设最优放置时.相邻两头牛属性分别为w1,s1,w2,s2,第一头牛在第二头上面,sum为第一头牛上面的牛的体重之和.那么第一头牛风险:rank1=sum-s1;第二头牛风险:rank2=sum+w1-

[USACO2005][POJ3045]Cow Acrobats(贪心)

题目:http://poj.org/problem?id=3045 题意:每个牛都有一个wi和si,试将他们排序,每头牛的风险值等于前面所有牛的wj(j<i)之和-si,求风险值最大的牛的最小风险值 分析:这就是noip2012 T2的来源= =只不过这里是加,noip里是乘 不妨设所有牛都按最优顺序排好了,考虑相邻的两头牛i和i+1,如果交换他们的位置,那么对前面和后面的结果都无影响,只是他们两个的风险值变化了(变大了),于是我们可以得到这个时候i和i+1的关系 设w1+w2+...+wi-1

Cow Acrobats(贪心)

Cow Acrobats Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3686   Accepted: 1428 Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the circus. Their hoofed feet prevent them from tig

POJ3045 Cow Acrobats(贪心)

传送门 大意:有N头牛叠罗汉,对于每头牛定义一个难受值D,D等于在它上面的所有奶牛的体重减去它的力量. 拿到这道题,感觉无从下手啊,贪力量,可是体重就不能保证上面的最好了.正解其实是要贪每头牛的力量加上体重,和大的放在下面. 证明: 设Di表示第i头奶牛的难受值,Wi表示第i头奶牛的体重,Si表示第i头奶牛的力量,令i,j相邻,且Wi+Si>Wj+Sj,设∑表示i和j上面的奶牛的重量之和 当i在j的上方时有 - Di=∑?Si ① - Dj=∑+Wi?Sj ② 当j在i的上方时有 - Di=∑+

POJ3045 Cow Acrobats —— 思维证明

题目链接:http://poj.org/problem?id=3045 Cow Acrobats Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5713   Accepted: 2151 Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the circus. The