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: 1838

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

#include<stdio.h>
#include<string.h>
#define MAXN 1000000+10
#include<algorithm>
using namespace std;

struct st
{
	int t,d;
	double ave;
}cow[MAXN];

int cmp(st a,st b)
{
	return a.ave>b.ave;
}

int main()
{
	int N,i;
	__int64 sum,min;
	scanf("%d",&N);
	min=sum=0;
	for(i=0;i<N;i++)
	{
		scanf("%d%d",&cow[i].t,&cow[i].d);
		cow[i].ave=cow[i].d*1.0/cow[i].t;
		sum+=cow[i].d;
	}
	sort(cow,cow+N,cmp);
	for(i=0;i<=N-1;i++)
	{
		sum-=cow[i].d;
		min+=cow[i].t*2*sum;
	}
	printf("%I64d\n",min);

	return 0;
}
时间: 2024-08-06 11:43:17

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

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

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 题解 《挑战程序设计竞赛》

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