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

题目:POJ - 3262

这道题,需要好好总结。

原来的思路是,依次计算出送走奶牛1~N会毁掉的花的数量,找出最小的,送走这头牛。然后又在剩下的奶牛中找可以使毁掉的花的数量最小的送走。如此循环直到全被送走。

对是对,只是也太繁琐了些,并且超时。

没有意识到其实这样的思路进行了很多次重复的比较。

后来看了别人的思路,发现可以先排序,一次就可以排好奶牛应该被送走的顺序。

刚开始觉得,这样很像之前做的Yogurt Factory题目,用动态规划记录每相邻两个牛的比较结果。

写完后发现不对,才发现又陷入了一个误区:动态规划适合于,前面的结果会影响后面的结果,但后面的不会影响前面的结果,的情况。

比如酸奶厂那道题,以后的星期可以用前一个星期生产的成本更低的酸奶,但之前的星期是不可用以后生产的,也就是说是局部比较,并不是统一的排序。

而这道题,需要统一的排序,因此只比较相邻两个是不行的。

刚开始想到了排序,但没有想到好的排序思路,觉得时长也不能作为依据,吃花数量也不能作为依据,没有想到这两个可以通过运算组成新的依据。

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <algorithm>
 4
 5 using namespace std;
 6
 7 int n;
 8 struct Cow {
 9     int first;
10     int second;
11     bool operator < (const Cow & c) {
12         return first * c.second < second * c.first;
13     }
14 };
15 Cow cow[100000];
16 typedef long long ll;
17
18 int main() {
19     scanf("%d", &n);
20     ll sum = 0;
21     ll res = 0;
22     for (int i = 0; i < n; i++) {
23         scanf("%d %d", &cow[i].first, &cow[i].second);
24         sum += cow[i].second;   //sum记录所有奶牛吃花的总速度
25     }
26     sort(cow, cow + n);
27     for (int i = 0; i < n - 1; i++) {
28         sum -= cow[i].second;   //每送走一头牛,吃花总速度就减去这头牛的速度
29         res += 2 * sum * cow[i].first;
30     }
31     cout << res << endl;
32     return 0;
33 }

开始学习动态规划~

时间: 2024-10-12 23:57:12

POJ 3262 Protecting the Flowers 题解 《挑战程序设计竞赛》的相关文章

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

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

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

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

【网络流#6】POJ 3041 Asteroids 二分图最大匹配 - 《挑战程序设计竞赛》例题

学习网络流中ing...作为初学者练习是不可少的~~~构图方法因为书上很详细了,所以就简单说一说 把光束作为图的顶点,小行星当做连接顶点的边,建图,由于 最小顶点覆盖 等于 二分图最大匹配 ,因此求二分图最大匹配即可. 邻接矩阵,DFS寻找增广路,匈牙利算法 邻接矩阵:复杂度O(n^3) 如果使用邻接表:复杂度O(n*m) #include<cstdio> #include<cstring> #include<cmath> #include<iostream>

【网络流#7】POJ 3281 Dining 最大流 - 《挑战程序设计竞赛》例题

不使用二分图匹配,使用最大流即可,设源点S与汇点T,S->食物->牛->牛->饮料->T,每条边流量为1,因为流过牛的最大流量是1,所以将牛拆成两个点. 前向星,Dinic,复杂度:O(V2E) 直接套用模板 #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<set

【网络流#9】POJ 2135 Farm Tour 最小费用流 - 《挑战程序设计竞赛》例题

[题意]给出一张无向图,从1开始到n,求两条没有公共边的最短路,使得路程总和最小 每条边的权值设为费用,最大流量设为1,然后就是从源点到汇点流量为2的最小费用流. 因为是规定了流量,新建一个源点和一个汇点,源点到结点1连一条最大流量为2,费用为0的边,结点N到汇点连一条最大流量为2,费用为0的边,这样就规定好流量了. #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #

POJ 3420 Quad Tiling 题解 《挑战程序设计竞赛》

POJ 3420 Quad Tiling贴瓷砖:4*N的地板上用2*1的瓷砖铺满,求所有方案数对M求余.3.4熟练掌握动态规划矩阵的幂久违地上了节课,太无聊,只好刷一题.假设S[n]表示填满n时的方案数,有S[0]=1.定义矩阵M[p][q] := 边缘p和边缘q可以拼合时取1,否则取0所谓的可以拼合表示,两个边缘拼起来后长度为1(为2就拼接不起来了),且内部缝隙可以用2*1的瓷砖填满.那么M就有一些简单的性质了,比如M的第一行应该是:0 0 0 0 0 0... 继续阅读:码农场 » POJ