列表

详情


NC21685. Race Sorting

描述

星际争霸(StarCraft)是暴雪公司制作发行的一款即时战略游戏。游戏描述了26世纪初期,位于银河系中心的三个种族在克普鲁星际空间中争夺霸权的故事。三个种族分别是:人类(Terran),异虫(Zerg),星灵(Protoss)。

现在tokitsukaze拥有n个单位,每个单位的编号是1-n,且没有任何两个单位编号相同。每个单位可能是人类,异虫,星灵中的一种。

tokitsukaze定义了一种排序:种族排序(Race Sorting)。

规则是这样的:规定三个种族的先后顺序,race1,race2,race3,表示第一个种族的所有单位在第二个种族的所有单位和第三个种族的所有单位之前,第二个种族的所有单位在第三个种族的所有单位之前。但是注意:种族间的单位,他们的相对顺序不发生改变。

也就是说,如果给出先后顺序为Zerg,Terran,Protoss,那么所有为Zerg的单位排在最前面,紧接着是所有Terran的单位,最后是所有Protoss的单位。如果其中一个种族没有任何一个单位,则跳过该种族。

那么对于tokitsukaze拥有的n个单位,做完给定先后顺序的Race Sorting后,n个单位的顺序是什么?请按顺序输出每个单位的编号。

输入描述

第一行包含一个正整数T(T≤20),表示T组数据。

对于每一组数据:
第一行包含一个正整数n(1≤n≤1000),表示有n个单位。
接下来n行,每行输入格式为:ID is race
其中,ID为一个正整数(1≤ID≤n),数据保证ID唯一。race为一个字符串,保证是"Terran","Zerg","Protoss"三种中的一种(没有引号)。
最后一行包含一个字符串,格式为:race1,race2,race3。表示3种种族的先后顺序。

数据保证race1,race2,race3为"Terran","Zerg","Protoss"的一种排列(没有引号)。

详情请见样例。

输出描述

对于每组数据:
按race1,race2,race3的顺序,在一行输出排序后的ID序列,两个ID用空格隔开,行末无多余空格。

示例1

输入:

3
5
1 is Terran
2 is Zerg
3 is Zerg
4 is Protoss
5 is Terran
Zerg,Terran,Protoss
5
1 is Terran
3 is Zerg
2 is Zerg
4 is Protoss
5 is Terran
Zerg,Terran,Protoss
1
1 is Protoss
Zerg,Protoss,Terran

输出:

2 3 1 5 4
3 2 1 5 4
1

原站题解

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

C++14(g++5.4) 解法, 执行用时: 18ms, 内存消耗: 760K, 提交时间: 2019-02-13 12:20:29

#include <iostream>
#include <cstdio>
#include <string> 
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
    char f[1005];
    int a[1005],i,j;
    int n;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        char t[30];
        scanf("%d is %s",&a[i],t);
        f[i]=t[0];
    }
    string s;
    cin>>s;
    for(i=0;i<s.size();i++)
    {
        for(j=0;j<n;j++)
        {
            if(f[j]==s[i])
            printf("%d ",a[j]);
        }
    }
    cout <<"\n";
     } 
    return 0;
}

C(clang 3.9) 解法, 执行用时: 10ms, 内存消耗: 680K, 提交时间: 2018-12-08 18:45:26

#include <stdio.h>
#include <string.h>
int main()
{
	int n,m,j,i;
	char s[30],f[1000];
	int t[1000];
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d",&m);
		 for(i=1;i<=m;i++)
		 {
		 	scanf("%d is %s",&t[i],s);
		 	f[i]=s[0];
		 }
		scanf("%s",s);
		for(i=0;i<=strlen(s)-1;i++)
		{
			if(s[i]=='Z'||s[i]=='T'||s[i]=='P')
		{
		for(j=1;j<=m;j++)
			   { 
			   	  if(f[j]==s[i])
			   	  printf("%d ",t[j]);
					 
			   } 
		}	  
		}
		printf("\n");
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 12ms, 内存消耗: 608K, 提交时间: 2018-12-16 19:51:35

#include <iostream>
#include <cstdio>
#include <string> 
using namespace std;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
	char f[1005];
	int a[1005],i,j;
	int n;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		char t[30];
		scanf("%d is %s",&a[i],t);
		f[i]=t[0];
	}
	string s;
	cin>>s;
	for(i=0;i<s.size();i++)
	{
		for(j=0;j<n;j++)
		{
			if(f[j]==s[i])
			printf("%d ",a[j]);
		}
	}
	cout <<"\n";
	 } 
	return 0;
}

Python3(3.5.2) 解法, 执行用时: 77ms, 内存消耗: 4040K, 提交时间: 2019-04-05 10:16:09

T = int(input())

for case in range(T):
    n=int(input())
    data=[]
    for i in range(n):
        data.append(input().split(" is "))
    od=input().split(",")
    ans=[]
    for i in od:
        for j in data:
            if i==j[1]:
                ans.append(j[0])
    print(' '.join(ans))

上一题