列表

详情


NC229458. 比赛!

描述

一场比赛刚刚结束。一些参赛者参加了比赛。比赛没有平局,每个参赛者在不同的时间内完成比赛。
每个参赛者被分配一个不同的字符表示他的身份(大小写字母或数字)。因此,参赛者完成比赛的顺序可以用一个字符串表示,其中每个字符只包含一次。
(字符串的第一个字符是比赛的获胜者,依此类推。例如,如果"x7X"是一场比赛的结果,则参赛者"x"获胜,参赛者"7"排名第二,参赛者"X"排名第三。)
阿强也是参赛者,想知道比赛结果。他决定采访一些参赛者,并根据他们能告诉你的信息推断出结果。
他碰巧采访的每个参赛者只记得另外两个参赛者:一个在他们之前完成,另一个在他们之后完成。例如,参赛者X可以给他信息"我在参赛者Y和Z之间的某个地方完成了比赛"。我们将此信息简称为"X:YZ"。请注意,顺序很重要:"X:ZY"与"X:YZ"的信息不同。
每次这样的采访都会告诉我们一些关于比赛结果的信息。例如,如果我们有参赛者a、b、c、d、X、Y、Z和信息"X:YZ",比赛的一些可能结果是"YaXbcZd"、"abcdYXZ"和"YdaXbZc"。
另一方面,以下结果不再可能:"XYZabcd"、"ZaXbcYd"和"YaZbXdc"。
他将获得采访者的记忆。记忆的每个元素都是一次访谈的结果,形式为"X:YZ"。请注意,同一名参赛者可能接受过多次采访,并且他们在每次采访时可能提供了不同的信息。
假设所有参赛者的集合就是那些出现在记忆中的参赛者的集合。(所有人,不仅仅是那些接受采访的人。) 请输出一种可能的结果使得满足所有采访,如果有多种输出任意一种。如果没有输出"No Answer"

输入描述

第一行一个整数n (1≤n≤500)。表示比赛结果的信息数量。
接下来n行每行一个形如X:YZ字符串,表示一个信息。

输出描述

输出一个字符串表示答案。如果没有正确的比赛结果输出“No Answer”

示例1

输入:

2
B:AD
7:BD

输出:

AB7D

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 416K, 提交时间: 2022-10-18 17:05:18

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
const int mod=1e9+7;
int n,m,deg[200];
set<int>st;
vector<int>a[200];
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);
	cin>>m;
	for(int i=1;i<=m;i++){
		char s[10];cin>>s+1;
		int x=s[1],y=s[3],z=s[4];
		st.insert(x);st.insert(y);st.insert(z);
		a[x].push_back(y);deg[y]++;
		a[z].push_back(x);deg[x]++;
	}
	queue<int>q;
	for(auto i:st)if(deg[i]==0)q.push(i);
	string s;
	while(q.size()){
		int t=q.front();q.pop();
		s.push_back((char)t);
		for(int i=0;i<a[t].size();i++){
			deg[a[t][i]]--;
			if(deg[a[t][i]]==0)q.push(a[t][i]);
		}
	}
	reverse(s.begin(),s.end());
	if(s.size()<st.size())cout<<"No Answer\n";
	else cout<<s<<'\n';
}

Python3 解法, 执行用时: 43ms, 内存消耗: 4612K, 提交时间: 2023-05-07 15:16:39

import sys
from collections import defaultdict, deque

n=int(sys.stdin.readline())
bian=defaultdict(list)
ru=defaultdict(int)
vis={}
cz=set()
for _ in range(n):
    a=sys.stdin.readline().strip()
    x,y,z=a[0],a[2],a[3]
    cz.add(x)
    cz.add(y)
    cz.add(z)
    bian[y].append(x)
    bian[x].append(z)
    ru[x]+=1
    ru[z]+=1
q=deque()
for i in cz:
    if ru.get(i,0)==0:
        q.append(i)
ans=[]
while q:
    x=q.popleft()
    ans.append(x)
    for i in bian[x]:
        ru[i]-=1
        if ru[i]==0:
            q.append(i)

if len(ans)==len(cz):
    print(*ans,sep='')
else:
    print('No Answer')

C++ 解法, 执行用时: 4ms, 内存消耗: 432K, 提交时间: 2021-11-01 11:11:30

#include<bits/stdc++.h>
using namespace std;char u,v,fh,mid,ans[205];vector <int> p[205];queue <int> q;int vis[205],tot,cnt,in[205],n;signed main(){cin>>n;for(int i=1;i<=n;i++){cin>>mid>>fh>>u>>v;vis[mid]=vis[u]=vis[v]=1;p[u].push_back(mid);p[mid].push_back(v);in[mid]++;in[v]++;}for(int i=30;i<150;i++)if(vis[i]){tot++;if(!in[i])q.push(i);}while(!q.empty()){u=q.front();q.pop();ans[cnt++]=u;int len=p[u].size();for(int i=0;i<len;i++){v=p[u][i];in[v]--;if(!in[v])q.push(v);}} if(cnt==tot)for(int i=0;i<cnt;i++)cout<<ans[i];else cout<<"No Answer";}

上一题