1 条题解
-
0
自动搬运
来自洛谷,原作者为

Vct14
**搬运于
2025-08-24 22:40:40,当前版本为作者最后更新于2022-10-24 21:04:00,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
我们先来分析一下样例 。
秒数 第 只蚂蚁 第 只蚂蚁 第 只蚂蚁 第 只蚂蚁 第 只蚂蚁 事件 第 只蚂蚁感冒 第 只蚂蚁与第 只蚂蚁碰面掉头,第 只蚂蚁被传染 第 只蚂蚁与第 只蚂蚁碰面掉头 第 只蚂蚁与第 只蚂蚁碰面掉头,第 只蚂蚁被传染 其中 表示向左, 表示向右, 表示感冒。
最后第 只蚂蚁感冒。
由表格可以发现,由于碰面就掉头,这些蚂蚁的相对排列顺序是保持不变的,那么,应该可以从开始的位置就能预测谁会被传染。
在样例 中,第 只蚂蚁(感冒蚂蚁)朝左。
- 位于第 只蚂蚁左侧且朝右蚂蚁有一只,即第 只蚂蚁,被传染;
- 由于步骤 ,第 只蚂蚁朝右,位于第 只蚂蚁右侧且朝左蚂蚁也有一只,即第 只蚂蚁,也被传染。
再举个第 只蚂蚁朝右的例子。
10 8 20 -12 -25秒数 第 只蚂蚁 第 只蚂蚁 第 只蚂蚁 第 只蚂蚁 第 只蚂蚁 事件 第 只蚂蚁感冒 第 只蚂蚁与第 只蚂蚁碰面掉头,第 只蚂蚁被传染 第 只蚂蚁与第 只蚂蚁碰面掉头,第 只蚂蚁被传染 第 只蚂蚁与第 只蚂蚁碰面掉头 第 只蚂蚁与第 只蚂蚁碰面掉头,第 只蚂蚁被传染 最后第 只蚂蚁感冒。
在这个例子中第 只蚂蚁(感冒蚂蚁)朝右。
- 位于第 只蚂蚁右侧且朝左蚂蚁有两只,即第 只蚂蚁和第 只蚂蚁,它们都被传染;(其中第 只蚂蚁在与第 只蚂蚁碰面后朝左)
- 由于步骤 ,第 只蚂蚁朝左,位于第 只蚂蚁左侧且朝右蚂蚁有一只,即第 只蚂蚁,也被传染。
总结以上两个例子:
设被感染的蚂蚁数为 ,第 只蚂蚁左侧朝右的蚂蚁数为 ,第 只蚂蚁右侧朝左的蚂蚁数为 。
- 第 只蚂蚁朝左时,
① 时, ;
② 时, ;
- 第 只蚂蚁朝右时,
① 时, ;
② 时, 。
代码:
#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
- 上传者