1 条题解

  • 0
    @ 2025-8-24 21:17:36

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar wbqhasvcf
    为了你唱下去,为你将希冀传递

    搬运于2025-08-24 21:17:35,当前版本为作者最后更新于2025-03-04 21:21:25,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    先将问题简化成给定若干个长度为 11 的纸带(即纸带上的数非 0011),看何种情况下可以确定机器对于长度为 11 的二进制数的运算逻辑。为了更清晰地思考,首先罗列出来 0011 的所有位运算情况与结果:

    0and0=00\operatorname{and}0=0 0and1=00\operatorname{and}1=0 1and1=11\operatorname{and}1=1 0or0=00\operatorname{or}0=0 0or1=10\operatorname{or}1=1 1or1=11\operatorname{or}1=1 0xor0=00\operatorname{xor}0=0 0xor1=10\operatorname{xor}1=1 1xor1=01\operatorname{xor}1=0

    由此可知!如果只有两个 00,吐出来的只能是 00,根本无法确定是哪种运算;如果有一个 00 和一个 11,机器吐出 11 就无法确定是 or\operatorname{or} 运算还是 xor\operatorname{xor} 运算;如果有两个 11,同理机器吐出 11 就死翘翘了,无法确定是 and\operatorname{and} 运算还是 or\operatorname{or} 运算。

    由于可以无数次塞纸带,所以很明显,第二、三种情况可以优势互补。即如果至少有一个 00 和两个 11 就完全可以确定机器的运算逻辑!(此句是金句,也是本题的AC要点)这个结论的证明很好想,只要塞两次纸条,一次塞 0011,一次塞 1111,先吐出 00 就一次确定是 and\operatorname{and} 运算了,先吐出 11 后吐出 11 可确认是 or\operatorname{or} 运算,否则后吐出 00 可确认是 xor\operatorname{xor} 运算。

    所以如果我们有且仅有 00,还差两个 11,至少需要再制作两张纸带;有至少一个 00 并有且仅有一个 11,还差一个 11,至少需要再制作一张纸带;有且仅有 11 的话也至少需要再制作一张纸带,因为只有 11 管够是不够的,还差一个 00;有至少一个 00 和至少两个 11,就不需要制作纸带。

    这仅仅是对于纸带长度全为 11 的情况的分析。如果长度为 nn,那么按照上面的逻辑逐个分析每一位,只需要先求出第 ii 位至少需要制作多少个纸带,记为 aia_{i}(由上述分析可知 aia_{i} 只可能是 221100),再取所有 aia_{i} 的最大值,即为最终至少需要制作的纸带数。

    这就是正解思路了,本题正常 AC 代码时间复杂度应为 O(n)O(n),难点仅在于思路分析,下面展示本人的参考代码,还是相当简洁清晰易懂的:

    #include<iostream>
    using namespace std;
    
    int n,cnt1[105],ans;
    string s;
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>s;
    		for(int j=0;j<s.size();j++)
    		    cnt1[j]+=(s[j]=='1');//《爱缩行の屑鄙人》 
    	}
    	for(int i=0;i<s.size();i++)
    	    if(cnt1[i]==1||cnt1[i]==n)//注意此处还要判断是否第i位上全都是1,即根本没有0,这种情况下需要再制作一个纸带,不加此判断会得90分 
    	        ans=max(ans,1);
    	    else if(cnt1[i]==0)
    	        ans=2;
    	cout<<ans;
    	return 0;
    }
    

    后记:本题为 BCSP-X 上半年复赛初中组第二题,你以为我跟第一题“厂房”一样赛时 A 了,其实我没有,恰相反我赛时爆零了!!!因为当时题根本没看懂,题意理解错了。所以其实这道题的题意描述有点儿问题,容易引发歧义,我也是赛后调试好的 AC 代码。最后这道题综合算法难度、思维难度、代码量等因素来看,建议评橙。

    • 1

    信息

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