1.题目描述
2.输入输出
3.输入输出样例
4.解题思路
首先对于本题,有一个更高层的抽象:题目中说到两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。其实这就等同于两只蚂蚁互相路过继续沿杆方向前进,而得了感冒的蚂蚁,则会将感冒传染给从它身边路过的蚂蚁。
接下来就是要分不同的情况去讨论了,首先是最容易理解的两种情况:
黑色表示初始就感冒的蚂蚁,红色表示本次实验中不会感冒的蚂蚁,蓝色表示是在本次实验中被传染感冒的蚂蚁。(但是想想看,还有两种特殊情况)
特殊情况是这样的:
在这种情况中,没有一只蚂蚁会与初始感冒的蚂蚁相向而行,要么背道而驰,要么同向前进。那么此时除了初始感冒的蚂蚁以外,就不会有任一一只蚂蚁感冒。
我的代码如下:
#includeusing namespace std; #define maxn 55 int a[maxn]; int cold=1; int flag=0; int main() { memset(a,0,sizeof a); int n; cin>>n; for(int i=0;i >a[i]; } if(a[0]>0){ for(int k=1;k abs(a[0])) flag=1; } for(int i=1;i 0 && abs(a[i])a[0] && flag) cold++;//此情况下,感冒的蚂蚁是被后续感冒的蚂蚁影响的 } } if(a[0]<0){ for(int k=1;k 0 && abs(a[k]) 0 && abs(a[i]) abs(a[0]) && flag) cold++;//此情况下,感冒的蚂蚁是被后续感冒的蚂蚁影响的 } } cout< 从网上找来一个优化的代码,更加简洁,思路更清晰,值得学习
#includeint abss(int s)//取绝对值 { if(s<0)return -s; else return s; } int main() { int qans=0,hans=0,n,i,gm,s; scanf("%d",&n); scanf("%d",&gm);//gm 首个感冒蚂蚁 位值 for(i=1;i abss(s)&&s>0)qans++;//当在首个蚂蚁左侧并且正向 必感冒 } if(gm>0&&hans!=0||gm<0&&qans!=0)printf("%d",qans+hans+1); else printf("1");//当首个感冒蚂蚁方向为正时 在首个蚂蚁右侧并且反向 为 0 或 return 0; //当首个感冒蚂蚁方向为负时 在首个蚂蚁左侧并且反向 为 0 则不会被感冒除首个感冒 }



