acw-3746.牛的学术圈

题目链接icon-default.png?t=M4ADhttps://www.acwing.com/problem/content/3749/分析:

  • 列表按每名实验室成员对这篇文章的贡献降序排列。
  • 如果多名研究员的贡献相等,则按字典序排列。
  • 由于更有资历的实验室成员负有更多的管理责任,更有资历的研究员从不会比资历较浅的研究员做出更多的贡献。

由以上三条进行推论

  1. 名字在前面,贡献越多
  2. 如果多名研究员的贡献相等,按字典序排列,这导致了按字典序排列的我们不能推断出他们的贡献大小,反过来说,如果排在前面的研究员名字的字典序大于他后面的,则可以确定他的贡献比他后面的研究员贡献要大
  3. 贡献越大的研究员资历越浅

举例说明:

假设成员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;
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值