POJ3262 Protecting the Flowers 【贪心】

Protecting the Flowers

Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 4418   Accepted: 1785

Description

Farmer John went to cut some wood and left N (2 ≤ N ≤ 100,000) cows eating the grass, as usual. When he returned, he found to his horror that the cluster of cows was in his garden eating his beautiful flowers. Wanting to minimize the subsequent
damage, FJ decided to take immediate action and transport each cow back to its own barn.

Each cow i is at a location that is Ti minutes (1 ≤ Ti ≤ 2,000,000) away from its own barn. Furthermore, while waiting for transport, she destroys Di (1 ≤ Di ≤ 100)
flowers per minute. No matter how hard he tries, FJ can only transport one cow at a time back to her barn. Moving cow i to its barn requires 2 × Ti minutes (Ti to get there and Ti to return).
FJ starts at the flower patch, transports the cow to its barn, and then walks back to the flowers, taking no extra time to get to the next cow that needs transport.

Write a program to determine the order in which FJ should pick up the cows so that the total number of flowers destroyed is minimized.

Input

Line 1: A single integer N

Lines 2..N+1: Each line contains two space-separated integers, Ti and Di, that describe a single cow‘s characteristics

Output

Line 1: A single integer that is the minimum number of destroyed flowers

Sample Input

6
3 1
2 5
2 3
3 2
4 1
1 6

Sample Output

86

Hint

FJ returns the cows in the following order: 6, 2, 3, 4, 1, 5. While he is transporting cow 6 to the barn, the others destroy 24 flowers; next he will take cow 2, losing 28 more of his beautiful flora. For the cows 3, 4, 1 he loses 16, 12, and 6 flowers respectively.
When he picks cow 5 there are no more cows damaging the flowers, so the loss for that cow is zero. The total flowers lost this way is 24 + 28 + 16 + 12 + 6 = 86.

Source

USACO 2007 January Silver

被long long坑了6次...贪心方法为每次选择的牛使得剩下的牛对花园破坏最小。

证明:若a,b为即将选择的两头牛,若果先选a的话。b牛的破坏是b.d*a.t,若先选b的话。a的破坏是a.d*b.t;无论a,b谁先谁后,其余牛的破坏都是(a.t+b.t)*other.d,所以仅仅须要依照先选择的牛使得剩下的牛对花园的破坏最小的标准对牛排序,再逐个选择就是了。

#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>

#define maxn 100005
typedef long long LL;

struct Node {
    int t, d;
    friend bool operator<(const Node& a, const Node& b) {
        return a.t * b.d < b.t * a.d;
    }
} cow[maxn];

int main() {
    int N, i, sumt = 0;
    LL sumd = 0;
    scanf("%d", &N);
    for(i = 0; i < N; ++i)
        scanf("%d%d", &cow[i].t, &cow[i].d);
    std::sort(cow, cow + N);
    for(i = 0; i < N; ++i) {
        sumd += cow[i].d * sumt;
        sumt += cow[i].t * 2;
    }
    printf("%lld\n", sumd);
    return 0;
}
时间: 2024-10-25 20:14:47

POJ3262 Protecting the Flowers 【贪心】的相关文章

poj3262 Protecting the Flowers

思路: 简单贪心,每次选择性价比最高的. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 6 struct node 7 { 8 int t, d; 9 }; 10 int n; 11 node a[100005]; 12 int sum[100005]; 13 14 bool cmp(const node & a, con

poj 3262 Protecting the Flowers 贪心

题意:给定n个奶牛,FJ把奶牛i从其位置送回牛棚并回到草坪要花费2*t[i]时间,同时留在草地上的奶牛j每分钟会消耗d[j]个草 求把所有奶牛送回牛棚内,所消耗草的最小值 思路:贪心,假设奶牛a和奶牛b所处位置为, 交换前 ....(ta, da) (tb, db).... 交换后 ....(tb, db) (ta, da).... 设此前已消耗的时间为x,那么交换前消耗的草:x*da + (x+ta)*db 交换后消耗的草:x*db + (x+tb)*da 除非交换后的消耗相比交换前的小才交换

P2878 [USACO07JAN]保护花朵Protecting the Flowers - 贪心

传送门 思路: 对于"找出一种最优排列顺序,使答案最优"的贪心题目,我们可以用"邻项交换"的方法去找出并证明贪心策略. 例如本题,我们假设有两头奶牛,其到达牛圈时间分别为Ti,Ti+1,每分钟吃掉的花朵数分别为Di,Di+1. 有两种情况: ① 排列顺序为i  i+1 则两头牛吃掉的花朵数为 res1=2TiDi+1 ② 排列顺序为i+1  i 则两头牛吃掉的花朵数为 res2=2Ti+1Di 假设前一种方案是最优解,则res1<res2,即TiDi+1<

poj -3262 Protecting the Flowers (贪心)

http://poj.org/problem?id=3262 开始一直是理解错题意了!!导致不停wa. 这题是农夫有n头牛在花园里啃花朵,然后农夫要把它们赶回棚子,每次只能赶一头牛,并且给出赶回每头牛需要的时间和牛在花园每分钟吃多少花朵,问你怎么安排让损失最小. 这题单独按time和eat排序都不行,得按它们的比率来排,如果是选择eat/time  则从大到小排,time/eat则从小到大排,但是不会严格证明. 1 #include <iostream> 2 #include <cstd

Protecting the Flowers(POJ3262)(贪心)

Protecting the Flowers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4540   Accepted: 1819 Description Farmer John went to cut some wood and left N (2 ≤ N ≤ 100,000) cows eating the grass, as usual. When he returned, he found to his ho

[bzoj1634][Usaco2007 Jan]Protecting the Flowers 护花_贪心

Protecting the Flowers 护花 bzoj-1634 Usaco-2007 Jan 题目大意:n头牛,每头牛有两个参数t和atk.表示弄走这头牛需要2*t秒,这头牛每秒会啃食atk朵花.求一个弄走牛的顺序,使得这些牛破坏最少的花. 注释:$1\le n \le 10^5$. 想法:贪心. 两头牛i和j. 只考虑这两头牛的位置. 如果i在j前面,拉走i的时候j会造成$2t_i*atk_j$朵花.反之同理. 比较两者谁大就放在前面. 在cmp中这样写就行了. 最后,附上丑陋的代码.

POJ 3262 Protecting the Flowers(贪心)

Language: Default Protecting the Flowers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4942   Accepted: 1973 Description Farmer John went to cut some wood and left N (2 ≤ N ≤ 100,000) cows eating the grass, as usual. When he returned,

POJ 3262 Protecting the Flowers【贪心】

一开始老是错,不知道咋回事,后来发现一开始sum就赋值为零了,再减去肯定是负的,一开始sum都没加数咋算,想漏了,顿时无语了,写了几十天了,今天才解决,哎~~注意输出有可能是超过整型的 http://blog.csdn.net/u014004096/article/details/36876287 Protecting the Flowers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4604   Accepted:

[BZOJ] 1634: [Usaco2007 Jan]Protecting the Flowers 护花

1634: [Usaco2007 Jan]Protecting the Flowers 护花 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 827  Solved: 536[Submit][Status][Discuss] Description Farmer John went to cut some wood and left N (2 <= N <= 100,000) cows eating the grass, as usual. When