兔子做题报告
一天,晨晨发现自己的n(2≤n≤100)只兔子跑到自己的花园里面,它们在尽情的吃着她的宝贝花卉。晨晨看在眼 里痛在心里,她现在只能把兔子逐个的抓回笼子里面。而送每只兔子回去的时间都不同,例如送第i只兔子回去需 要ti(1≤ti≤100)单位时间,那么晨晨送第i只兔子来回共需要花费2*ti单位时间,另外每一只兔子单位时间的破 坏力都不同,例如第i只兔子单位时间内破坏di (1≤di≤100)朵花。现在的问题是,晨晨如何安排送这n只兔子回 笼子才能使这些兔子的破坏最小。
这道题需要一波瞎搞:
在这个序列中,任意两个互换都不会比该序列更优,所以我们只考虑两个的情况。
设最优序列中第一个为$D1,T1$;第二个为$D2,T2$。
那么有$D2*T1*2<D1*T2*2$,得到$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);
}