1 条题解

  • 0
    @ 2025-8-24 22:53:11

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Like_Amao
    ENFJ-A||代词使用他||壶关条件:https://www.luogu.me/paste/5j8jlfwn#

    搬运于2025-08-24 22:53:11,当前版本为作者最后更新于2025-07-28 09:19:11,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    前言

    题目传送门

    思路

    这道题算是一道挺简单的模拟了。

    我们用一个数组 ansans 来存储答案,在刚开始的时候,把数组初始化为 ?,然后在开始做题。

    对于每一篇论文的作者列表中,不难发现,当这一次输入的名字的字典序,小于前一个名字的字典序时,前面所有人的贡献都会比这个人大,所以,这个人的资历比前面任何一个人的资历要深,所以这个时候我们把这个人处于输入的第几个数设为 ii,把第 1 个到这个人前面的那个人,用 jj 循环,所以,当这样时,ansi,j=1ans _ {i , j} = 1ansj,i=0ans _ {j , i} = 0

    当这个人的字典序大于前一个人的字典序时,就要往前找到最后一次字典序小于前一个字典序,把这个位置标记为 tt,从 1 循环到 tt 在这之间的全部都没最开始那个人的资历深。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    char ans[101][101];
    map<string,int>mp;
    int main()
    {
    	int k,n;
    	cin>>k>>n;
    	for(int i=1;i<=n;i++)
    	{
    		string str;
    		cin>>str;
    		mp[str]=i;
    	}
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			ans[i][j]='?';
    		}
    	}
    	while(k--)
    	{
    		string str[101];
    		for(int i=1;i<=n;i++)
    		{
    			cin>>str[i];
    		}
    		for(int i=2;i<=n;i++)
    		{
    			if(str[i]<str[i-1])
    			{
    				for(int j=1;j<=i-1;j++)
    				{
    					if(ans[mp[str[i]]][mp[str[j]]]=='?')
    					{
    						ans[mp[str[i]]][mp[str[j]]]='1';
    					}
    					if(ans[mp[str[j]]][mp[str[i]]]=='?')
    					{
    						ans[mp[str[j]]][mp[str[i]]]='0';
    					}
    				}
    			}
    			else
    			{
    				int t=i;
    				while(str[t]>str[t-1])
    				{
    					t--;
    				}
    				t--;
    				for(int j=1;j<=t;j++)
    				{
    					if(ans[mp[str[i]]][mp[str[j]]]=='?')
    					{
    						ans[mp[str[i]]][mp[str[j]]]='1';
    					}
    					if(ans[mp[str[j]]][mp[str[i]]]=='?')
    					{
    						ans[mp[str[j]]][mp[str[i]]]='0';
    					}
    				}
    			}
    		}
    	}
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			if(i==j)
    			{
    				cout<<"B";
    			}
    			else
    			{
    				cout<<ans[i][j];
    			}
    		}
    		cout<<endl;
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    9512
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者