HDU 4393 Throw nails

题意: 有n个人进行一场自行车竞速比赛,知道了每个人第1s走fi米,以后每秒走si米,一个人扔钉子破坏比赛,每秒他都选最靠前的那个人,如果有多个人,选编号最小

          的那个,问你这些人依次被破退出比赛的顺序。

分析:   Si最大只有100,可以建立优先队列数组s[1..100],对于每个优先队列,按第一关键字Fi第二关键字ID排序,每次取出所有的优先队列里最大值,

         然后直接 计算(Time-1)*Si + Fi 找最大的way,将对应的优先队列pop并输出对应ID即可。   

  

#include<cstdio>
#include<cstring>
#include<queue>
#include<cstdlib>
#define INF 0x1f1f1f1f
using namespace std;
struct node
{
    int fi,xu;
    bool operator<(const node& a)const{
        return (fi<a.fi)||(fi==a.fi&&xu>a.xu);
    }
}tt;
priority_queue<node>q[122];
int main()
{
    int ca=1,i,j,tmp;
    int t,n,f,s,dmin,dmax,res;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(j=1;j<=n;j++)
        {
            scanf("%d%d",&f,&s);
            tt.fi=f;
            tt.xu=j;
            q[s].push(tt);
        }
        printf("Case #%d:\n",ca++);
        for(i=1;i<=n;i++)
        {
            dmax=-1;
            dmin=INF;
            for(j=1;j<=100;j++)
            if(!q[j].empty())
            {
                tt=q[j].top();
                if((i-1)*j+tt.fi>dmax||(i-1)*j+tt.fi==dmax&&tt.xu<dmin)
                {
                    dmax=(i-1)*j+tt.fi;
                    res=j;
                    dmin=tt.xu;
                }
            }
            tmp=q[res].top().xu;
            printf("%d%c",tmp,i==n?'\n':' ');
            q[res].pop();
        }
    }
    return 0;
}

 

 

 

转载于:https://www.cnblogs.com/dream-wind/archive/2012/08/27/2659108.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值