原题链接:蓝桥杯历届试题-蚂蚁感冒
解题思路:
因为蚂蚁的速度相等,所以不存在后面的蚂蚁追上前面的蚂蚁的情况,不需要计算两只蚂蚁相遇时的位置和时间,只需要使一次循环中每只蚂蚁相遇次数相等即可
注意事项:
参考代码:
#include<stdio.h>
#include<math.h>
struct ant{
int d,flag;//flag等于1代表感冒,等于0代表健康
}ant[100],t;
int main(){
int n,i,j,num=1;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&ant[i].d);
ant[i].flag=0;
}
ant[0].flag=1;
//给蚂蚁按绝对值递增排序
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(fabs(ant[i].d)>fabs(ant[j].d)){
t=ant[i];
ant[i]=ant[j];
ant[j]=t;
}
}
}
//如果发生第一次相遇时第一个感冒的蚂蚁可以直接出去,则输出1
if(ant[0].flag==1&&ant[0].d<0||ant[n-1].flag==1&&ant[n-1].d>0)printf("1");
else {
while(n>1){
//i定位到左端向右走的第一只蚂蚁
for(i=0;i<n;i++){
if(ant[i].d>0)break;
}
//j定位到右端向左走的第一只蚂蚁
for(j=n-1;j>=i;j--){
if(ant[j].d<0)break;
}
n=j-i+1;
//将两边不发生相遇直接离开树枝的蚂蚁去掉
if(i!=0){
int k=0;
while(i<=j){
ant[k]=ant[i];
k++;i++;
}
}
//使发生相遇的蚂蚁反向
for(i=0;i<n-1;i++){
if(ant[i].d>0&&ant[i+1].d<0){
if(ant[i].flag==1&&ant[i+1].flag==0){
ant[i+1].flag=1;
num++;
}
else if(ant[i].flag==0&&ant[i+1].flag==1){
ant[i].flag=1;
num++;
}
ant[i].d=-(ant[i].d);
ant[i+1].d=-(ant[i+1].d);
i++;
}
}
}
printf("%d",num);
}
}0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复