POJ1030 Rating

造福后人,必须翻译一下这痛苦的描述了。

 

按照AC后的理解来说,题目给出两场比赛编号1~100的队伍名次情况(有些队伍没有出现),每行是并列名次,下一行是前面队伍个数累计的名次,求两场比赛的总排名。

 

对于两场都参加的队伍,两场名次之和较小的排前面。

对于只参加一场的队伍,在不冲突的情况下和与其该场同名次的且参加了两场的另一支队伍总排名相同。

对于不满足上述的只参加一场的队伍,看是否可以插入一个位置,这个位置前面的队伍都是该场在其前面的队伍,后面的队伍也都是该场在其后面的队伍。多个能插入同位置的队伍,按他们在自己那一场的排名来比较。

对于以上条件都不满足的队伍,忽略掉。

 

输出的时候同名次队伍要在一行中按队伍ID升序输出。

  1 //把只参加一场的另一场名次赋值为同一场同名次队伍另一场的名次,但是不直接赋值,而
  2 //先缓存(nex),并统计缓存次数(cgcnt),如果缓存仅一次,即没有总名次不同队伍的
  3 //冲突,则真正把另一场赋值为nex。之后进行第一次排序。
  4 //对于只参加一场而无其他参加两场的同名次队伍时,判断是否可合理插入,记录插入位置
  5 //之后进行第二次排序,针对这次处理的这类队伍进行比较。
  6 //输出,终名次相同者输出在同一行。
  7 //单独写了完整的名次比较函数Compab(),函数中顺带处理了前两点所需数据。
  8 #include<stdio.h>
  9 #include<string.h>
 10 #include<stdlib.h>
 11 #include<ctype.h>
 12 const int maxn = 101;
 13 typedef struct
 14 {
 15     int rt[2];
 16     int num;
 17     int nex;
 18     int cgcnt;
 19     int share;
 20 } TEAM;
 21 TEAM te[maxn];
 22 int n, m;
 23 char buf[10001];
 24 void ReadData(int n, int ith)
 25 {
 26     int i, j, rank, cnt, tnum;
 27     for(i = rank = 1; i <= n; ++ i, rank += cnt)
 28     {
 29         gets(buf);
 30         for(j = cnt = 0; buf[j]; ++ j)
 31         {
 32             if(isdigit(buf[j]))
 33             {
 34                 sscanf(buf + j, "%d", &tnum);
 35                 te[tnum].rt[ith] = rank, ++ cnt;
 36                 te[tnum].num = tnum;
 37                 while(isdigit(buf[j])) ++ j;
 38                 -- j;
 39             }
 40         }
 41     }
 42 }
 43 int Compab(TEAM &a, TEAM &b)
 44 {
 45     if((a.rt[0] || a.rt[1]) && !(b.rt[0] || b.rt[1])) return -1;
 46     if(!(a.rt[0] || a.rt[1]) && (b.rt[0] || b.rt[1])) return 1;
 47     if(a.cgcnt == -1 && b.cgcnt != -1) return a.rt[0] ? a.rt[0] - b.rt[0] : a.rt[1] - b.rt[1];
 48     if(b.cgcnt == -1 && a.cgcnt != -1) return b.rt[0] ? a.rt[0] - b.rt[0] : a.rt[1] - b.rt[1];
 49     if(a.cgcnt == -1 && b.cgcnt == -1)
 50     {
 51         if(a.share == b.share)
 52             return a.rt[0] ? a.rt[0] - (b.rt[0] ? b.rt[0] : b.rt[1]) : a.rt[1] - (b.rt[1] ? b.rt[1] : b.rt[0]);
 53         return a.share - b.share;
 54     }
 55     if(a.rt[0] && a.rt[1] && !(b.rt[0] && b.rt[1]))
 56     {
 57         if(b.rt[0] == a.rt[0])
 58         {
 59             if(!b.nex || b.nex + b.rt[0] == a.rt[0] + a.rt[1])
 60                 b.nex = a.rt[1], b.share = a.num;
 61             else ++ b.cgcnt;
 62         }
 63         else if(b.rt[1] == a.rt[1])
 64         {
 65             if(!b.nex || b.nex + b.rt[1] == a.rt[0] + a.rt[1])
 66                 b.nex = a.rt[0], b.share = a.num;
 67             else ++ b.cgcnt;
 68         }
 69         return -1;
 70     }
 71     if(b.rt[0] && b.rt[1] && !(a.rt[0] && a.rt[1]))
 72     {
 73         if(a.rt[0] == b.rt[0])
 74         {
 75             if(!a.nex || a.nex + a.rt[0] == b.rt[0] + b.rt[1])
 76                 a.nex = b.rt[1], a.share = b.num;
 77             else ++ a.cgcnt;
 78         }
 79         else if(a.rt[1] == b.rt[1])
 80         {
 81             if(!a.nex || a.nex + a.rt[1] == b.rt[0] + b.rt[1])
 82                 a.nex = b.rt[0], a.share = b.num;
 83             else ++ a.cgcnt;
 84         }
 85         return 1;
 86     }
 87     if((a.rt[0] && a.rt[1]) && (b.rt[0] && b.rt[1]))
 88         return a.rt[0] + a.rt[1] - b.rt[0] - b.rt[1];
 89     if((a.rt[0] || a.rt[1]) && (b.rt[0] || b.rt[1]))
 90     {
 91         if(a.rt[0] && b.rt[0]) return a.rt[0] - b.rt[0];
 92         if(a.rt[1] && b.rt[1]) return a.rt[1] - b.rt[1];
 93         return 0;
 94     }
 95 }
 96 int comp(const void *a, const void *b)
 97 {
 98     return Compab(*(TEAM *)a, *(TEAM *)b) ? Compab(*(TEAM *)a, *(TEAM *)b) : (*(TEAM *)a).num - (*(TEAM *)b).num;
 99 }
100 int Judge(TEAM &a, int ith)
101 {
102     int i, j;
103     for(i = 1; te[i].rt[0] && te[i].rt[1] && i < maxn; ++ i)
104         if(te[i].rt[ith] > a.rt[ith]) break;
105     j = i;
106     for(; te[i].rt[0] && te[i].rt[1] && i < maxn; ++ i)
107         if(te[i].rt[ith] <= a.rt[ith]) break;
108     if(j < maxn && (Compab(te[j - 1], te[j]) == 0 || te[i].rt[0] && te[i].rt[1]))
109         return a.rt[0] = a.rt[1] = a.cgcnt = 0;
110     return a.cgcnt = -1, j;
111 }
112 int main()
113 {
114     int i, j, k;
115     while(scanf("%d\n", &n) != EOF)
116     {
117         memset(te, 0, sizeof(te));
118         for(i = 0; i < maxn; ++ i) te[i].num = i;
119         ReadData(n, 0);
120         scanf("%d\n", &m);
121         ReadData(m, 1);
122         for(i = 1; i < maxn; ++ i)
123             for(j = i + 1; j < maxn; ++ j)
124                 Compab(te[i], te[j]);
125         for(i = 1; i < maxn; ++ i)
126         {
127             if(te[i].cgcnt) te[i].rt[0] = te[i].rt[1] = 0;
128             else if(te[i].nex)
129             {
130                 if(te[i].rt[0]) te[i].rt[1] = te[i].nex;
131                 else te[i].rt[0] = te[i].nex;
132             }
133         }
134         qsort(te + 1, 100, sizeof(TEAM), comp);
135         for(i = 1; i < maxn; ++ i)
136         {
137             if(te[i].rt[0] && !te[i].rt[1])
138                 te[i].share = Judge(te[i], 0);
139             else if(!te[i].rt[0] && te[i].rt[1])
140                 te[i].share = Judge(te[i], 1);
141         }
142         qsort(te + 1, 100, sizeof(TEAM), comp);
143         for(i = 1; (te[i].rt[0] || te[i].rt[1]) && i < maxn; i = j)
144         {
145             printf("%d", te[i].num);
146             for(j = i + 1; (te[j].rt[0] || te[j].rt[1]) && !Compab(te[i], te[j]); ++ j)
147                 printf(" %d", te[j].num);
148             printf("\n");
149         }
150     }
151     return 0;
152 }
posted @ 2012-08-27 20:46  CSGrandeur  阅读(688)  评论(0编辑  收藏  举报