原题链接:蓝桥杯历届试题-蚂蚁感冒
解题思路:
刚看到题目时觉得很复杂。在推倒例子时意外发现其实可以看做在碰面时,蚂蚁穿过对方,且感染对方。这道题只是需要得知蚂蚁感冒的数目,如果需要知道具体是那只,只需在穿过时交换号码即可。(刚开始发现还很高兴,后来发现原来大家都是这么做)
注意事项:
要算上原来的第一只蚂蚁所以ans=1
可能的错误:
if(k>0){
for(int i=2;i<=n;i++){
if(a[i]<0&&abs(a[i])>k) ans++,b=1; // b=1证明有从a[1]对面来的且被传染的
if(b==1&&a[i]>0&&a[i]<k) ans++; // 在a[1]后面的且与a[1]同向会被“从a[1]对面来的且被传染的”传染
}
}你这里可能会这么写。这样明显不对。因为你不能两个同时确定,但凡有一只“从a[1]对面来的且被传染的”的在a[1]后面的且与a[1]同向的都会被感染,但是你如果同时扫描,就可能漏掉。
代码虽然粗糙,但是易想到。
参考代码:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n;
int ans=1;
int b=0;
cin>>n;
int a[101];
for(int i=1;i<=n;++i){
cin>>a[i];
}
int k=a[1];
if(k>0){
for(int i=2;i<=n;i++){
if(a[i]<0&&abs(a[i])>k) ans++,b=1; // b=1证明有从a[1]对面来的且被传染的
}
for(int i=2;i<=n;i++){
if(b==1&&a[i]>0&&a[i]<k) ans++; // 在a[1]后面的会被“从a[1]对面来的且被传染的”传染
}
}
if(k<0){
for(int i=2;i<=n;i++){
if(a[i]>0&&abs(a[i])<-k) ans++,b=1;
}
for(int i=2;i<=n;i++){
if(b==1&&a[i]<0&&abs(a[i])>-k) ans++;
}
}
cout<<ans;
return 0;
}0.0分
6 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复