## 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;
}