解题思路:
因为蚂蚁的速度相等,所以不存在后面的蚂蚁追上前面的蚂蚁的情况,不需要计算两只蚂蚁相遇时的位置和时间,只需要使一次循环中每只蚂蚁相遇次数相等即可
注意事项:
参考代码:
#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分
6 人评分
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:511 |
C语言程序设计教程(第三版)课后习题9.4 (Java代码)浏览:1446 |
字符串问题 (C语言代码)浏览:1634 |
printf基础练习2 (C语言代码)浏览:796 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:820 |
杨辉三角 (C语言代码)浏览:733 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:538 |
C语言程序设计教程(第三版)课后习题11.8 (C语言代码)浏览:1059 |
很简单,,题解1041:C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:616 |
C二级辅导-阶乘数列 (C语言代码)浏览:671 |