P2878 [USACO07JAN]保护花朵Protecting the Flowers

题目描述

有N头奶牛跑到FJ的花园里去吃花儿了,它们分别在距离牛圈T分钟处吃花儿,每分钟会吃掉d朵卡哇伊的花儿,

(此处有点拗口,不要在意细节啊!),FJ现在要将它们给弄回牛圈,但是他每次只能弄一头回去,来回用时总共为2 * T分钟,

在这段时间内,其它的奶牛会继续吃FJ卡哇伊的花儿,速度保持不变,当然正在被赶回牛圈的奶牛就没口福了!

现在要求以一种最棒的方法来尽可能的减少花儿的损失数量,求奶牛吃掉花儿的最少朵数!

输入输出格式

输入格式:

 

第1行:单个整数N.

第2..N + 1行:每行包含两个以空格分隔的整数Ti和Di,它们描述了单个牛的特征

 

输出格式:

 

第1行:一个整数,它是被毁花的最小数量

输入输出样例

输入样例#1: 复制
6
3 1
2 5
2 3
3 2
4 1
1 6
输出样例#1: 复制
86

说明

FJ按以下顺序返回奶牛:6,2,3,4,1,5。当他将牛6运到谷仓时,其他人会摧毁24朵花; 

接下来他将采取牛2,失去28多个他美丽的植物群。对于奶牛3,4,1,他分别失去了16,12和6朵花。

当他挑选奶牛5时,没有更多的奶牛损坏花朵,因此奶牛的损失为零。以这种方式失去的总花是24 + 28 + 16 + 12 + 6 = 86。

为什么!!!

贪心这么难!!!

怎么也想不到啊。。。

mmp,

厌世。

teacher胡乱找方法,,

真的是要当无数次小白鼠,

没有信心,就不要立什么flag。。

hh,当然你觉得无所谓,

对你来说没什么影响,

反正就这么点儿相处时间了,,

hh,没前途的你,

中年油腻男!!!

呸!

讲题讲题,,

贪心,啊。

我刚开始只按他们的速度排了序,

想让速度大的先离开,

也是一种思路吧,

但还有很多特殊的比较大的情况是不成立的,

这种思路只能拿十分。

然后肯定是要先按一种思路排序,之后枚举,

枚举的时候也要注意,

尽量想出思路来用一重循环。

这里贪心的思路不止要看速度,当然也要看距离,

速度大,距离小的优先,

是吧?

嗯,应该是,

所以呢?

怎么把二者结合起来呢??

比例式!做除法啊!!!

太聪明了太聪明了!

比较速度d/距离t,就好了!

然后排完序之后的枚举这里算一个优化吧,

解释不出来,

应该能看懂,

然后恍然大悟!

哦!

这样啊!!!

hhh,,

看代码吧:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 int n;
 9 long long ans,t;
10 
11 struct node{
12     int t,d;
13 }a[20000002];
14 
15 bool cmp(node x,node y)
16 {
17     return (x.d *1.0)/(x.t *1.0)*1.0>=(y.d *1.0)/(y.t *1.0)*1.0;
18 }
19 
20 int main()
21 {
22     scanf("%d",&n);
23     for(int i=1;i<=n;++i)
24         scanf("%d%d",&a[i].t ,&a[i].d );
25     sort(a+1,a+n+1,cmp);
26     for(int i=1;i<=n;++i)
27     {
28         ans+=t*a[i].d ;
29         t+=a[i].t *2;
30     } 
31     printf("%lld",ans);
32     return 0;
33 }

如果你不开心,那我就把右边这个帅傻子分享给你吧, 

你看,他这么好看,那么深情的望着你,你还伤心吗? 

真的!这照片盯上他五秒钟就想笑了。 

一切都会过去的。

原文地址:https://www.cnblogs.com/Mary-Sue/p/9438650.html