题目链接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#include #include using namespace std; const int N=110; char ord[N][N]; //存储i条记录得到的结果 string record[N]; //贡献记录 unordered_map 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



