NC208116. 考试成绩
描述
有N个考生(1<=N<=500),考号依次为1,2,3,。。。。,N进行考试,考试结束后,学校要将所有考生从前往后依次排名,但现在学校不能直接获得每个考生的考试成绩,只知道两人成绩之间的关系,即用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。
输入描述
输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示考生的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即考生P1的成绩高于P。
输出描述
给出一个符合要求的排名。输出时考号之间有空格,最后一名后面没有空格。
其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的考生在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
示例1
输入:
3 2 3 1 3 2 17 16 16 1 13 2 7 3 12 4 12 5 17 6 10 7 11 8 11 9 16 10 13 11 15 12 15 13 17 14 17 15 17 16 0 0
输出:
3 1 2 17 6 14 15 12 4 5 13 2 11 8 9 16 1 10 7 3
pypy3(pypy3.6.1) 解法, 执行用时: 248ms, 内存消耗: 73228K, 提交时间: 2020-06-20 13:27:31
from heapq import heappush, heappop def solve(): n, m = map(int, input().split()) if n == 0 and m == 0: exit(0) e = [[] for _ in range(n + 1)] d = [0] * (n + 1) for _ in range(m): u, v = map(int, input().split()) e[u].append(v) d[v] += 1 q = [] for i in range(1, n + 1): if not d[i]: heappush(q, i) ans = [] while q: u = heappop(q) ans.append(u) for v in e[u]: d[v] -= 1 if not d[v]: heappush(q, v) print(*ans) while True: try: solve() except EOFError: exit(0)
Go(1.9.1) 解法, 执行用时: 124ms, 内存消耗: 2788K, 提交时间: 2020-06-20 14:23:18
package main import "fmt" var m, n int var a []map[int]bool //a[i][j] i的分低于于j var tmp []int func main() { for{ var x, y int fmt.Scan(&n, &m) if n+m==0{ return } tmp=make([]int,n+1) a = make([]map[int]bool, n+1) for i:=0;i<=n;i++{ a[i]=make(map[int]bool) } for i := 0; i < m; i++ { fmt.Scan(&x, &y) a[y][x]=true } for i:=0;i<n;i++{ dfs() } fmt.Println() } } func dfs() { for i:=1;i<=n;i++{ if tmp[i]==0&&len(a[i])==0{ fmt.Print(i," ") tmp[i]=1 clear(i) return } } } func clear(t int) { for i:=1;i<=n;i++{ if tmp[i]==0{ delete(a[i],t) } } }
C(clang 3.9) 解法, 执行用时: 6ms, 内存消耗: 372K, 提交时间: 2020-06-20 17:24:30
#include<stdio.h> int main() { while(1) { int q1[510]={0},q2[510]={0}; int n,m; scanf("%d %d",&n,&m); if(n==0) break; for(int i=0;i<m;i++) { int p1,p2; scanf("%d %d",&p1,&p2); while(q1[p1]!=0) { if(p2<q1[p1]) { q1[p2]=q1[p1]; break; } else p1=q1[p1]; } q1[p1]=p2; q2[p2]=p1; } int x; for(x=1;x<=n;x++) if(q2[x]==0) break; while(q1[x]!=0) { printf("%d ",x); x=q1[x]; } printf("%d",x); printf("\n"); } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 9ms, 内存消耗: 484K, 提交时间: 2020-06-22 19:13:00
#include<bits/stdc++.h> using namespace std; vector<int>R[505]; int main() { int i,j,x,n,m,in[505]; bool V[505]={0}; while(~scanf("%d%d",&n,&m)) { if(!n&&!m)break; for(i=1;i<=n;i++)R[i].clear(),V[i]=in[i]=0; while(m--) { scanf("%d%d",&i,&j); R[i].push_back(j),in[j]++; } for(i=1;i<=n;i++) { for(x=1;x<=n;x++)if(!V[x]&&!in[x])break; V[x]=1,printf("%d ",x); for(j=0;j<R[x].size();j++)in[R[x][j]]--; } printf("\n"); } }