onetwo123


私信TA

用户名:16030199004

访问量:51071

签 名:

等  级
排  名 33
经  验 9369
参赛次数 5
文章发表 91
年  龄 0
在职情况 学生
学  校 西安电子科技大学
专  业

  自我简介:


解题思路:

因为蚂蚁的速度相等,所以不存在后面的蚂蚁追上前面的蚂蚁的情况,不需要计算两只蚂蚁相遇时的位置和时间,只需要使一次循环中每只蚂蚁相遇次数相等即可



注意事项:





参考代码:

#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分

5 人评分

  评论区