蓝桥杯 蚂蚁感冒
技巧题
蚂蚁碰面后会掉头。这个掉头动作会让我们的逻辑变得混乱,因为谁也不知道什么时候会碰面,表面上看会无从下手,那么我们分析一下蚂蚁碰面后的状态。
1.两只健康蚂蚁碰面后,两个方向都会有一只健康的蚂蚁在行走
2.至少一只蚂蚁有病,两个方向都会有一只有病的蚂蚁在行走
其实蚂蚁碰面后根本没有必要掉头,或者说即使掉头,效果也是和不掉头一样的。
所以每只蚂蚁都会坚定不移的朝一个固定的方向走,下面看看第一只有病的蚂蚁,如果它初始向左走,那是不是它左边所有的向右走的蚂蚁都会遭殃?同样,当左边遭了秧的蚂蚁遇到了其右边向左走的蚂蚁,那么它们也会遭殃。
存在一种特殊的情况,即所有的蚂蚁都朝一个方向走,那谁也不会被传染,最终只有一只蚂蚁有病。
假设有病的蚂蚁是A,A左边向右走的蚂蚁数量为lf,A右边向左走的蚂蚁数量为rg,那么
1.A向右走,且rg==0,;或者A向左走,且lf==0,ans=1;
2.ans=lf+rg+1;
- #include <iostream>
- #include <stdio.h>
- #include <math.h>
- #include <algorithm>
- using namespace std;
- struct Ant //结构体 用Ant定义出来的变量拥有Ant的一套(pos dir cold)
- {
- int pos;
- int dir;
- int cold;
- };
- int n,ans,lf,rg;
- Ant ant[60];
- bool cmp(const Ant a,const Ant b)
- {
- return a.pos<b.pos;
- }
- int main()
- {
- int i,j;
- int len;
- int cold_ant;
- while(~scanf("%d",&n))
- {
- for(i=0;i<n;i++)
- {
- scanf("%d",&len); //分别设置ant[i]的属性
- ant[i].pos=abs(len);
- ant[i].dir=len<0?-1:1;
- ant[i].cold=0;
- }
- ant[0].cold=1;
- lf=rg=0;
- sort(ant,ant+n,cmp);
- //找到生病的蚂蚁下标为多少,同时确定了If的数量
- for(i=0;i<n;i++)
- {
- if(ant[i].cold==1)
- break;
- if(ant[i].dir>0)
- lf++;
- }
- cold_ant=i;
- for(i=i+1;i<n;i++)
- { //从i+1开始往右,即从生病的蚂蚁往右,目的是寻找rg的数量
- if(ant[i].dir<0)
- rg++;
- }
- if((ant[cold_ant].dir>0&&rg==0)||(ant[cold_ant].dir<0&&lf==0)) //即上所述的两种情况
- ans=1;
- else
- ans=lf+rg+1;
- printf("%d\n",ans);
- }
- return 0;
- }

浙公网安备 33010602011771号