hdu 4442 Physical Examination

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4442

题意:去体检,求做完所有检查所花费的最小时间模上一个数

      花费的时间规则如下

      有n项活动,每项活动有两个数字 a b

      a代表现在去排队所花费的时间  b代表每一秒该活动需要等待的时间是多b秒

      举个简单的例子

      2

      1 3  第一项活动1秒,执行完第一项活动之后执行第二项

      1 9  由于先执行的第一项活动,执行第二项活动时所需的时间就变成了10秒

题目分类:贪心

题目分析:因为当执行当前任务时,b是乘以现在所需要的时间,a是直接相加的,刚开始时想的是b的权重比较大,所以,按照b从大到小的排序,a不用管,后来细细想想,其实是有漏洞的,如果b比较小,而a特别大的时候,顺序就是不对的。   

代码

#include<bits/stdc++.h>

using namespace std;

#define LL __int64
#define MOD 31536000

struct P
{
    LL a,b;

}num[100009];

//bj*ai<=aj*bi

LL cmp(P X,P Y)
{
    return X.a*Y.b<Y.a*X.b;
}

int main()
{
    //freopen("in.txt","r",stdin);
    int n;
    while(scanf("%d",&n)&&n)
    {
        for(int i=1;i<=n;i++)
        {
            cin>>num[i].a>>num[i].b;
        }
        sort(num+1,num+n+1,cmp);
        /*for(int i=1;i<=n;i++)
        {
            cout<<num[i].a<<"  "<<num[i].b<<endl;
        }*/
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            ans=(ans+ans*num[i].b+num[i].a)%MOD;
        }

        cout<<ans<<endl;

    }
    return 0;
}

 

你可能感兴趣的:(hdu 4442 Physical Examination)