兔子做题报告

一天,晨晨发现自己的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);
}
posted @ 2018-12-10 23:26  加固文明幻景  阅读(13)  评论(0)    收藏  举报  来源