1 条题解

  • 0
    @ 2025-8-24 22:40:40

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Vct14
    **

    搬运于2025-08-24 22:40:40,当前版本为作者最后更新于2022-10-24 21:04:00,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    我们先来分析一下样例 22

    秒数 22 只蚂蚁 11 只蚂蚁 44 只蚂蚁 33 只蚂蚁 55 只蚂蚁 事件
    00 8R8R 10LG10LG 12R12R 20L20L 25R25R 11 只蚂蚁感冒
    11 9RG9RG 9LG9LG 13R13R 19L19L 26R26R 22 只蚂蚁与第 11 只蚂蚁碰面掉头,第 22 只蚂蚁被传染
    44 6LG6LG 12RG12RG 16R16R 16L16L 29R29R 44 只蚂蚁与第 33 只蚂蚁碰面掉头
    66 4LG4LG 14RG14RG 14LG14LG 18R18R 31R31R 11 只蚂蚁与第 44 只蚂蚁碰面掉头,第 44 只蚂蚁被传染

    其中 LL 表示向左, RR 表示向右, GG 表示感冒。

    最后第 1,2,41,2,4 只蚂蚁感冒。

    由表格可以发现,由于碰面就掉头,这些蚂蚁的相对排列顺序是保持不变的,那么,应该可以从开始的位置就能预测谁会被传染。

    在样例 22 中,第 11 只蚂蚁(感冒蚂蚁)朝左。

    1. 位于第 11 只蚂蚁左侧且朝右蚂蚁有一只,即第 22 只蚂蚁,被传染;
    2. 由于步骤 11 ,第 11 只蚂蚁朝右,位于第 11 只蚂蚁右侧且朝左蚂蚁也有一只,即第 44 只蚂蚁,也被传染。

    再举个第 11 只蚂蚁朝右的例子。

    10 8 20 -12 -25
    
    秒数 22 只蚂蚁 11 只蚂蚁 44 只蚂蚁 33 只蚂蚁 55 只蚂蚁 事件
    00 8R8R 10RG10RG 12L12L 20R20R 25L25L 11 只蚂蚁感冒
    11 9R9R 11RG11RG 11LG11LG 21R21R 24L24L 11 只蚂蚁与第 44 只蚂蚁碰面掉头,第 44 只蚂蚁被传染
    22 10RG10RG 10LG10LG 12RG12RG 22R22R 23L23L 22 只蚂蚁与第 11 只蚂蚁碰面掉头,第 22 只蚂蚁被传染
    33 9LG9LG 11RG11RG 13RG13RG 22L22L 23R23R 33 只蚂蚁与第 55 只蚂蚁碰面掉头
    99 4LG4LG 16RG16RG 17LG17LG 18RG18RG 28R28R 44 只蚂蚁与第 33 只蚂蚁碰面掉头,第 33 只蚂蚁被传染

    最后第 1,2,3,41,2,3,4 只蚂蚁感冒。

    在这个例子中第 11 只蚂蚁(感冒蚂蚁)朝右。

    1. 位于第 11 只蚂蚁右侧且朝左蚂蚁有两只,即第 44 只蚂蚁和第 55 只蚂蚁,它们都被传染;(其中第 33 只蚂蚁在与第 55 只蚂蚁碰面后朝左)
    2. 由于步骤 11 ,第 11 只蚂蚁朝左,位于第 11 只蚂蚁左侧且朝右蚂蚁有一只,即第 22 只蚂蚁,也被传染。

    总结以上两个例子:

    设被感染的蚂蚁数为 nn ,第 11 只蚂蚁左侧朝右的蚂蚁数为 xx ,第 11 只蚂蚁右侧朝左的蚂蚁数为 yy

    1. 11 只蚂蚁朝左时,

    x0x≠0 时, n=x+y+1n=x+y+1

    x=0x=0 时, n=1n=1

    1. 11 只蚂蚁朝右时,

    y0y≠0 时, n=x+y+1n=x+y+1

    y=0y=0 时, n=1n=1


    代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    int x[55];
    
    int main(){
    	int n;
    	cin>>n;
        for(int i=1; i<=n; i++) scanf("%d",&x[i]);
        int l=0,r=0;
        for(int i=2; i<=n; i++){
            if(abs(x[i])<abs(x[1]) && x[i]>0) l++;
            if(abs(x[i])>abs(x[1]) && x[i]<0) r++;
        }
        int sum=0;
        if(x[1]<0){
            if(l==0) sum=1;
            else sum=l+r+1;
        }
        else{
            if(r==0) sum=1;
            else sum=l+r+1;
        }
        cout<<sum;
        return 0;
    }
    

    注释版:

    #include<bits/stdc++.h>
    using namespace std;
    
    int x[55];//定义蚂蚁数组
    
    int main(){
    	int n;//定义蚂蚁数
    	cin>>n;//输入蚂蚁数
        for(int i=1; i<=n; i++) scanf("%d",&x[i]);//输入每个蚂蚁的情况
        int l=0,r=0;//统计在第1只蚂蚁左侧朝右、右侧朝左的蚂蚁数。
        for(int i=2; i<=n; i++){
            if(abs(x[i])<abs(x[1]) && x[i]>0) l++;//左侧朝右
            if(abs(x[i])>abs(x[1]) && x[i]<0) r++;//右侧朝左
        }
        int sum=0;//定义感冒蚂蚁总数
        if(x[1]<0){//第1只蚂蚁朝左
            if(l==0) sum=1;
            else sum=l+r+1;
        }
        else{//第1只蚂蚁朝右
            if(r==0) sum=1;
            else sum=l+r+1;
        }
        cout<<sum;//输出
        return 0;//华丽结束
    }
    
    • 1

    信息

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