UVALive 4216 Pole Position

题目是ACM ICPC  South American Regional 2008的原题。

题目很水:给定个序列xi,yi,其中xi代表编号xi的车子在第i名,这个名次较发车时的名次而言,变动了yi位,yi>0表示车子名次上升了yi名,<0表示下降了yi名,=0不变。求出发车时的名次。如果无法求出,则输出-1.

做法:扫描一遍恢复即可,如果一个名次上多个车子,则-1.一遍AC

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <utility>
 7 #include <cstring>
 8 #include <fstream>
 9 #include <string>
10 using namespace std;
11 const int MAXN=1005;
12 int now[MAXN][2],start[MAXN];
13 int main(int argc, char* argv[])
14 {
15     int n;
16     while(cin>>n,n!=0)
17     {
18         for(int i=0;i<n;i++)
19             cin>>now[i][0]>>now[i][1];
20         memset(start,0,sizeof(start));
21         int ans=1;
22         for(int i=n-1;i>=0;i--)
23         {
24             int tmp=i+now[i][1];
25             if(!(tmp>=0&&tmp<n))
26             {
27                 ans=0;
28                 break;
29             }
30             if(start[tmp]!=0)
31             {
32                 ans=0;
33                 break;
34             }
35             start[tmp]=now[i][0];
36         }
37         if(ans)
38         {
39             for(int i=0;i<n-1;i++)
40                 printf("%d ",start[i]);
41             printf("%d\n",start[n-1]);
42         }else
43             printf("-1\n");;
44     }
45 }

 

posted @ 2012-05-02 00:38  jzlikewei  阅读(176)  评论(0编辑  收藏  举报