UVa 10026 - Shoemaker's Problem

题目链接:UVa 10026 - Shoemaker's Problem

贪心,类似白皮书上性价比那个题。

贪心策略(转自:Staginner):我们不妨拿相邻的两个事件a、b来说明一下。由于a、b之后的事件是固定的,所以我们无论排成ab还是排成ba后面部分的损失都是固定的,那么损失的差别主要来源于究竟是排成ab还是排ba。排ab的损失为ta*fb,排ba的损失为tb*fa,那么如果ta*fb<tb*fa,我们就排成ab,这样可以得到fa/ta>fb/tb,推而广之,就得到了我们的贪心策略。

注意一下浮点数判断相等与否最好是提前设置一个精度。

开学了,又不得不听一些垃圾老师讲的垃圾课,还得做一些垃圾事儿。哎,努力吧,保研或者考研,就在这一个学期决定了,希望可以保研吧。

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

const int MAX_N = 1000 + 10;
const double e = 1e-9;

struct order
{
    double fine,time;
    int num;
    double res;
    bool operator < (const order &a) const
    {
        if (fabs(res - a.res)>e)
            return res > a.res;//从大到小排序
        return num < a.num;//保持稳定的排序
    }
};

int N,T;
order o[MAX_N];

int main()
{
    cin>>T;
    while(T--)
    {
        cin>>N;
        for(int i = 0;i < N;i++)
        {
           cin>>o[i].time>>o[i].fine;
           o[i].res = o[i].fine / o[i].time;
           o[i].num = i + 1;
        }
        sort(o,o+N);
        for(int i = 0;i < N;i++)
        {
            if(i + 1 == N)
                cout<<o[i].num<<endl;
            else
                cout<<o[i].num<<" ";
        }
        if(T)
            cout<<endl;
    }
    return 0;
}


你可能感兴趣的:(UVa 10026 - Shoemaker's Problem)