题目描述
有N头奶牛跑到FJ的花园里去吃花儿了,它们分别在距离牛圈T分钟处吃花儿,每分钟会吃掉d朵卡哇伊的花儿,
(此处有点拗口,不要在意细节啊!),FJ现在要将它们给弄回牛圈,但是他每次只能弄一头回去,来回用时总共为2 * T分钟,
在这段时间内,其它的奶牛会继续吃FJ卡哇伊的花儿,速度保持不变,当然正在被赶回牛圈的奶牛就没口福了!
现在要求以一种最棒的方法来尽可能的减少花儿的损失数量,求奶牛吃掉花儿的最少朵数!
输入输出格式
输入格式:
第1行:单个整数N.
第2..N + 1行:每行包含两个以空格分隔的整数Ti和Di,它们描述了单个牛的特征
输出格式:
第1行:一个整数,它是被毁花的最小数量
输入输出样例
说明
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 }
如果你不开心,那我就把右边这个帅傻子分享给你吧,
你看,他这么好看,那么深情的望着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。