打卡信奥刷题(770)用C++信奥P9938[普及组/提高] [USACO21OPEN] Acowdemia II B

P9938 [USACO21OPEN] Acowdemia II B

题目描述

Bessie 正在申请计算机科学的研究生,并取得了一所久负盛名的计算机科学实验室的面试通知。然而,为了避免冒犯任何人,Bessie 有意先确定实验室的 NNN 名现有成员的相对资历(1≤N≤1001\le N\le 1001N100)。没有两名实验室成员的资历相同,但确定他们的资历深浅可能并不好办。为此,Bessie 将会对实验室的出版物进行调查。

每份出版物均包含一个作者列表,为所有 NNN 名实验室成员的一个排列。列表按每名实验室成员对这篇文章的贡献降序排列。如果多名研究员的贡献相等,则按字典序排列。由于更有资历的实验室成员负有更多的管理责任,更有资历的研究员从不会比资历较浅的研究员做出更多的贡献。

例如,在一个由资历较浅的学生 Elsie、资历较深的教授 Mildred、以及十分资深的教授 Dean 组成的实验室中,可能存在一篇论文 Elsie-Mildred-Dean,如果他们做出了不等的贡献(也就是说,Elsie 做出的贡献比 Mildred 更多,Mildred 比 Dean 更多)。然而,也有可能存在一篇论文 Elsie-Dean-Mildred,如果 Mildred 和 Dean 做出了相等的贡献,而 Elsie 做出了更多的贡献。

给定实验室的 KKK 份出版物(1≤K≤1001\le K\le 1001K100),对于实验室中每对研究员,如果可能的话帮助 Bessie 判断其中谁的资历更深。

输入格式

输入的第一行包含两个整数 KKKNNN

第二行包含 NNN 个空格分隔的字符串,为实验室的成员的名字。每个字符串均由小写字母组成,且至多包含 101010 个字符。

以下 KKK 行,每行包含 NNN 个空格分隔的字符串,表示一份出版物的作者列表。

输出格式

输出 NNN 行,每行 NNN 个字符。在第 iii 行内,对于所有 j≠ij\neq ij=i,当可以确定第 iii 名成员比第 jjj 名成员资历更深时字符 jjj1,当可以确定第 iii 名成员比第 jjj 名成员资历更浅时字符 jjj0,当不能由给定的出版物确定时为 ?

iii 行的字符 iii 应为 B,因为这是 Bessie 最喜欢的字母。

输入输出样例 #1

输入 #1

1 3
dean elsie mildred
elsie mildred dean

输出 #1

B11
0B?
0?B

输入输出样例 #2

输入 #2

2 3
elsie mildred dean
elsie mildred dean
elsie dean mildred

输出 #2

B00
1B0
11B

说明/提示

样例解释 1

在这个样例中,单独一份论文 elsie-mildred-dean 并不能提供足够的信息判断 Elsie 比 Mildred 资历更深或更浅。然而,我们可以推断出 Dean 一定比这两名研究员资历更深,从而资历排序为 Elsie<Mildred<Dean 和 Mildred<Elsie<Dean 均是可能的。

样例解释 2

在这个样例中,唯一能与两篇论文相一致的资历排序为 Elsie<Mildred<Dean,这是因为基于第一个样例所提供的信息,第二篇论文可以帮助我们推断出 Mildred 比 Elsie 的资历更深。

C++实现

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
bool vis[101][101];
string name[101];
map<string,int>id;
signed main(){
cin>>k>>n;
for(int i=1;i<=n;i++)
cin>>name[i],id[name[i]]=i;
for(int i=1;i<=k;i++){
for(int j=1;j<=n;j++)
cin>>name[j];
for(int j=1;j<=n;j++){
int x=j+1;
while(x<=n&&name[x]>name[x-1])
x++;
for(int y=x;y<=n;y++)
vis[id[name[y]]][id[name[j]]]=1;
}
}for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j)cout<<“B”;
else if(!vis[i][j]&&!vis[j][i])
cout<<“?”;
else
cout<<vis[i][j];
}cout<<endl;
}return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值