poj -3262 Protecting the Flowers (贪心)

http://poj.org/problem?id=3262

开始一直是理解错题意了!!导致不停wa。

这题是农夫有n头牛在花园里啃花朵,然后农夫要把它们赶回棚子,每次只能赶一头牛,并且给出赶回每头牛需要的时间和牛在花园每分钟吃多少花朵,问你怎么安排让损失最小。

这题单独按time和eat排序都不行,得按它们的比率来排,如果是选择eat/time  则从大到小排,time/eat则从小到大排,但是不会严格证明。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <vector>
 5 #include <cstring>
 6 #include <string>
 7 #include <algorithm>
 8 #include <string>
 9 #include <set>
10 #include <functional>
11 #include <numeric>
12 #include <sstream>
13 #include <stack>
14 #include <map>
15 #include <queue>
16
17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
18
19 #define ll long long
20 #define inf 0x7f7f7f7f
21 #define lc l,m,rt<<1
22 #define rc m + 1,r,rt<<1|1
23 #define pi acos(-1.0)
24
25 #define L(x)    (x) << 1
26 #define R(x)    (x) << 1 | 1
27 #define MID(l, r)   (l + r) >> 1
28 #define Min(x, y)   (x) < (y) ? (x) : (y)
29 #define Max(x, y)   (x) < (y) ? (y) : (x)
30 #define E(x)        (1 << (x))
31 #define iabs(x)     (x) < 0 ? -(x) : (x)
32 #define OUT(x)  printf("%I64d\n", x)
33 #define lowbit(x)   (x)&(-x)
34 #define Read()  freopen("a.txt", "r", stdin)
35 #define Write() freopen("dout.txt", "w", stdout);
36 #define N 100005
37 using namespace std;
38
39 struct point
40 {
41     int x,y;
42     double d;
43     bool operator <(const point &a) const
44     {
45         return d>a.d;
46     }
47 }p[100010];
48 int main()
49 {
50    //Read();
51    int n;
52    ll sum,t;
53    while(~scanf("%d",&n))
54    {
55        sum=t=0;
56        for(int i=0;i<n;i++)
57        {
58            scanf("%d%d",&p[i].x,&p[i].y);
59            p[i].d=p[i].y*1.0/p[i].x;
60            t+=p[i].y;  //这样处理 方便计算
61        }
62        sort(p,p+n);
63        //for(int i=0;i<n;i++) printf("%d %d\n",p[i].x,p[i].y);
64        for(int i=0;i<n;i++)
65        {
66            t-=p[i].y;
67            sum+=p[i].x*t*2;
68        }
69        printf("%lld\n",sum);
70    }
71     return 0;
72 }
时间: 2025-01-14 14:09:22

poj -3262 Protecting the Flowers (贪心)的相关文章

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 除非交换后的消耗相比交换前的小才交换

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:

POJ 3262 Protecting the Flowers 题解 《挑战程序设计竞赛》

题目:POJ - 3262 这道题,需要好好总结. 原来的思路是,依次计算出送走奶牛1~N会毁掉的花的数量,找出最小的,送走这头牛.然后又在剩下的奶牛中找可以使毁掉的花的数量最小的送走.如此循环直到全被送走. 对是对,只是也太繁琐了些,并且超时. 没有意识到其实这样的思路进行了很多次重复的比较. 后来看了别人的思路,发现可以先排序,一次就可以排好奶牛应该被送走的顺序. 刚开始觉得,这样很像之前做的Yogurt Factory题目,用动态规划记录每相邻两个牛的比较结果. 写完后发现不对,才发现又陷

POJ 3262 Protecting the flowers

http://poj.org/problem?id=3262 这道题和蝎子那道题是相同贪心思路 http://www.cnblogs.com/oscar-cnblogs/p/6329703.html //贪心方式一:列出函数关系式比较复杂//方式二:像蝎子那道题 先讨论两只 奶牛怎样送是最优的/*a1 b1a2 b2先送1 ans = 2*a1*b2先送2 ans = 2*b1*a2那么如果先送1 更优说明 2*a1*b2 < 2*b1*a2 --->> a1 / b1 < a2

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 3362 Protecting the Flowers

这题和金华区域赛A题(HDU 4442)是一样的做法. 对两个奶牛进行分析,选择两个奶牛总花费少的方式排序. bool cmp(const X&a,const X&b){ return a.t*b.d<b.t*a.d;} #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=10

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 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中这样写就行了. 最后,附上丑陋的代码.