题目链接https://www.acwing.com/problem/content/3749/分析:
- 列表按每名实验室成员对这篇文章的贡献降序排列。
- 如果多名研究员的贡献相等,则按字典序排列。
- 由于更有资历的实验室成员负有更多的管理责任,更有资历的研究员从不会比资历较浅的研究员做出更多的贡献。
由以上三条进行推论
- 名字在前面,贡献越多
- 如果多名研究员的贡献相等,按字典序排列,这导致了按字典序排列的我们不能推断出他们的贡献大小,反过来说,如果排在前面的研究员名字的字典序大于他后面的,则可以确定他的贡献比他后面的研究员贡献要大
- 贡献越大的研究员资历越浅
举例说明:
假设成员A,B,C,D,E,F对这篇文章的贡献降序排列为:
A B D C F E
可以得出以下结论:
- D一定比C E F的贡献大,F一定比E的贡献大
- A B D 一定比C E F 贡献大,A B D C F 一定比 E 贡献大
- A B D 一定比C E F 资历浅,A B D C F 一定比 E 资历浅
推论:下降字典序后面所有人比前面所有人贡献小且资历深
输出格式
输出 N 行,每行 N 个字符。在第 i 行内,对于所有 j≠i,当可以确定第 i 名成员比第 j 名成员资历更深时字符 j 为
1
,当可以确定第 i 名成员比第 j 名成员资历更浅时字符 j 为0
,当不能由给定的出版物确定时为?
。第 i 行的字符 i 应为
B
,因为这是 Bessie 最喜欢的字母。分析输出格式可得,有几个研究员我们就输出几行,第 i 行输出第 i 个人除他自己外和其他人的资历比较结果,资历更深输出1,更浅输出0 ,不确定输出?,同行第 i 个位置因为没有与人比较,所以输出B
输入
1 6 a b c d e f a b d c f e
输出
B?0?00 ?B0?00 11B10? ??0B00 1111B1 11?10B
unordered_map - C++ Referencehttp://www.cplusplus.com/reference/unordered_map/unordered_map/代码:
#include<iostream>
#include<cstring>
#include<unordered_map>
using namespace std;
const int N=110;
char ord[N][N]; //存储i条记录得到的结果
string record[N]; //贡献记录
unordered_map<string,int> researcher; //研究员
int main()
{
int k,n; //n个研究员,k条记录
cin>>k>>n;
for(int i=1;i<=n;i++)
{
string name;
cin>>name;
researcher[name]=i; //名字为name的研究员是我们的第i位研究员
//方便之后的操作
}
//一些初始化操作
memset(ord,'?',sizeof ord);
for(int i=1;i<=n;i++) ord[i][i]='B';
//开始分析记录
while(k--)
{
for(int i=1,r=1;i<=n;i++) //r为要更新序列的后一个
{
cin>>record[i];
//找到一个降序的字典序,若找到,更新ord数组
if(record[i-1]>record[i])
r=i;
int s = researcher[record[i]]; //s表示降序的那个人
//更新,r及r之后的都比之前的贡献小,资历深
for(int j=1;j<r;j++)
{
int t = researcher[record[j]];
ord[s][t]='1',ord[t][s]='0';
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<ord[i][j];
cout<<endl;
}
return 0;
}