hdu 3744 A Runing Game

## A Runing Game ##
A Runing Game

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 917 Accepted Submission(s): 412

Problem Description
HDU hosts sporting meeting every year. One of the most exciting events is the 10000M-running.During the match many students are running on the track. So, how about the rank list now?

As we know, in a running , we rank the player according to the length everyone has passed . So if one player run 400M(one lap) farther than another player , it looks like they are running at the same position on the track , but the rank of the former is much better than the latter. Now given everyone’s position on the track , and one rank list , can you tell me whether the rank list is possible.

Input
The first line of input gives the number of cases, T (at most 110). the first line of each case has two intergers, n,m. (1 <= n <= 100,1 <= m <= 40000,n <= m),represents there’re n players in the m-meter running.
then n lines describe every player.

Each line have two intergers , Xi , Ri .Representing the i-th player is running at xi[0 , 399] meter in his recent lap, and ranks Ri in the ranklist .And the data make sure that no pair of the students have the same Xi or Ri. And the start point is at 0 in their first lap.

Output
If the rank list is possible, output “YES” ,output “NO” otherwise.

Sample Input
2
3 400
100 1
49 2
28 3
3 800
100 1
150 2
154 3

Sample Output
YES
NO

题目大意:T组数据,每组数据有参赛人数n和要跑多少米m的长度,然后n行两个数据a,b。a代表这个人距离起点的位置,b代表这个人的名次,问你这个名次有没有可能。

想法:创建一个数组,用下标表示名次,这样就可以省去排序的时间。如果前一名的位置在后一名的位置的前面,如果要排名是成立的,那么两个人可以在同一圈,就把这个人的位置加上他跑的最大圈数。如果前一名的位置在后一名的位置的后面,如果要排名成立,那么前一名一定要比后一名多跑一圈。所以前一名的跑步长度要比后一名的跑步长度多一圈,最后判断是不是所有的前一名跑步的长度都要比后一名的要长。

#include<bits/stdc++.h>
using namespace std;
int a[101];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(a,0,sizeof(a));
        int n,m;
        cin>>n>>m;
        int x,y;
        for(int i=0;i<n;i++)
        {
            cin>>x>>y;
            a[y]=x;
        }
        int q=m/400,r=m%400;
        if(a[1]<=r)
        {
            a[1]=a[1]+q*400;
        }
        else
        {
            a[1]=a[1]+(q-1)*400;
            q--;
        }
        for(int i=2;i<=n;i++)
        {
            if((a[i]+q*400)<a[i-1])
            {
            //    q--;
                if(q<0)
                q=0;
                a[i]=a[i]+q*400;

            }
            else
            {
                q--;
                if(q<=0)
                q=0;
                a[i]=a[i]+q*400;
            }
        }
        int flag=0;
        for(int i=2;i<=n;i++)
        {
            if(a[i-1]>a[i])
            continue;
            else
            {
                cout<<"NO"<<endl;
                flag=1;
                break;
            }
        }
        if(flag==0)
        cout<<"YES"<<endl;
    }
    return 0;
}

代码提交地址:http://acm.hdu.edu.cn/showproblem.php?pid=3744

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值