兔子做题报告

一天,晨晨发现自己的n(2≤n≤100)只兔子跑到自己的花园里面,它们在尽情的吃着她的宝贝花卉。晨晨看在眼 里痛在心里,她现在只能把兔子逐个的抓回笼子里面。而送每只兔子回去的时间都不同,例如送第i只兔子回去需 要ti(1≤ti≤100)单位时间,那么晨晨送第i只兔子来回共需要花费2*ti单位时间,另外每一只兔子单位时间的破 坏力都不同,例如第i只兔子单位时间内破坏di (1≤di≤100)朵花。现在的问题是,晨晨如何安排送这n只兔子回 笼子才能使这些兔子的破坏最小。

这道题需要一波瞎搞:

在这个序列中,任意两个互换都不会比该序列更优,所以我们只考虑两个的情况。

设最优序列中第一个为D1,T1;第二个为D2,T2

那么有D2T12<D1T22,得到T1/D1<T2/D2

由此可以得出排在前面的数的Ti/Di>排在后面的数的Ti/Di

所以,按Ti/Di排序即可。

code

#include <cstdio> #include <algorithm> inline void read(int &x) { x=0;char ch=0;bool sign=false; while(ch<'0' || ch>'9') { sign|=(ch== '-'); ch=getchar(); } while(! (ch<'0' || ch>'9')) { x=x*10+(ch^48); ch=getchar(); } x=sign? -x : x; } inline void print(long long x) { if(x<0)putchar('-'),x=-x; if(x>9)print(x/10); putchar(x%10+'0'); } struct node { int Time,power; bool operator < (const node & rhs) { return (Time==rhs.Time && power>rhs.power) || Time<rhs.Time; } }a[110]; int n; int sum; int ans; int main() { freopen("flower.in","r",stdin); freopen("flower.out","w",stdout); read(n); for(int i=1; i<=n; i++) { read(a[i].Time),read(a[i].power); sum+=a[i].power; } std::sort(a+1,a+n+1); for(int i=1; i<=n; i++) { sum-=a[i].power; ans+=sum*2*a[i].Time; } print(ans); }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17777022.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示