zoukankan      html  css  js  c++  java
  • 5.2.4 确定比赛名次

    确定比赛名次

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 206 Accepted Submission(s): 118

    Problem Description
    有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排 名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定 排名。
     

    Input
    输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。
     

    Output

                给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。

    其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
     

    Sample Input
    4 3
    1 2
    2 3
    4 3
     

    Sample Output
    1 2 4 3

    思路:拓扑排序,但我的程序慢死了。

     1 #include <cstdio>
     2 #include <cstring>   
     3 #include <iostream>
     4 #include <cmath>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 int c,t,n,cas,x,y,m;
     9 const int maxn=510;
    10 
    11 bool f[maxn][maxn],flag,p[maxn];
    12 int ans[maxn],cnt;
    13 
    14 void close()
    15 {
    16     exit(0);
    17 }
    18 
    19 void work()
    20 {
    21 }
    22 
    23 void init()
    24 {
    25     while(scanf("%d %d",&n,&m)!=EOF)
    26      {
    27          cnt=0;
    28          memset(f,false,sizeof(f));
    29          memset(p,false,sizeof(p));
    30          for (int i=1;i<=m;i++)
    31          {
    32              scanf("%d %d",&x,&y);
    33              f[x][y]=true;
    34          }
    35          while (cnt!=n)
    36          {
    37             for (int i=1;i<=n;i++)
    38              {
    39                  if (p[i]) continue;
    40                  flag=false;
    41                   for (int j=1;j<=n;j++)
    42                     if (f[j][i])
    43                     {
    44                         flag=true;
    45                         break;
    46                     }
    47                 if (flag) continue;
    48                 cnt++;
    49                ans[cnt]=i;
    50                  p[i]=true;
    51                    for (int j=1;j<=n;j++)
    52                        if (f[i][j])
    53                            f[i][j]=false;
    54                      break;
    55              }
    56          }
    57          for (int i=1;i<=cnt;i++)
    58              if (i!=1)
    59                  printf(" %d",ans[i]);
    60              else printf("%d",ans[i]);
    61          printf("\n");
    62      }
    63 }
    64 
    65 
    66 int main ()
    67 {
    68     init();
    69     work();
    70     close();
       }
  • 相关阅读:
    【类似N^N做法的斐波那契数列】【HDU1568】 Fibonacci
    【取对数+科学计数法】【HDU1060】 N^N
    【枚举+数学】【HDU1271】整数对 难度:五颗星
    【欧拉函数】【HDU1286】 找新朋友
    【筛素数表证明】【O[n]】
    【沙茶了+筛选保存最大质因数】【HDU2136】Largest prime factor
    【gcd+数学证明】【HDU1722】 CAKE
    【贪心】【HDU3177】 搬家问题
    HDU2093 字符串2种不错的读入思路
    tf.argmax()
  • 原文地址:https://www.cnblogs.com/cssystem/p/2918354.html
Copyright © 2011-2022 走看看