列表

详情


NC208116. 考试成绩

描述

N个考生(1<=N<=500),考号依次为123,。。。。,N进行考试,考试结束后,学校要将所有考生从前往后依次排名,但现在学校不能直接获得每个考生的考试成绩,只知道两人成绩之间的关系,即用P1P2表示,排名时P1P2之前。现在请你编程序确定排名。

输入描述

输入有若干组,每组中的第一行为二个数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");
	}
}

上一题