蓝桥杯 [蚂蚁感冒] 思维
题目链接:http://lx.lanqiao.cn/problem.page?gpid=T119
题目大意:类似挑战程序设计的蚂蚁走杆子,区别在于有感冒蚂蚁,相撞时会传染。问最后有多少多被传染。
关键思想:看过蚂蚁走杆子原题的应该有这种思维,就是相撞往回走的蚂蚁和原来两只蚂蚁继续走是等效的。在本题中,区别就是两只相撞的蚂蚁都会患感冒。
速度都相同使得本题很好解,考虑这几种情况。
比如初始感冒蚂蚁为10,那么下次他能感染到的蚂蚁就是-12,-15之类的,可以化成条件式10+x<0并且10*x<0,当10替换成其他数(包括负数时)也是适用的。
还要注意的是,如果有一只蚂蚁被传染了,那么其他和初始感冒蚂蚁同向并且在前端的都会被感染,比如9,10,-12。初始蚂蚁为10,那么-12的被感染后接着会和9相遇,9就躺枪了。
于是我们就又抽象出这样的条件式来筛选后来躺枪的哪些(10+x)<0并且10*x<0(这只在有至少一只被感染的情况下才会有)。10可以换成其他数(包括负数)。这些条件式是通过举例归纳得到的。
代码如下:
/* CopyRight GentleGamer */ #include <iostream> #include <cstdio> #include <algorithm> using namespace std; int main(){ int n,x[55]; scanf("%d",&n); bool flag=false; //flag标记是否有第一只被感染的 int ache,cnt=1; //ache为被感染的蚂蚁 scanf("%d",&ache); for(int i=0;i<n-1;i++){ scanf("%d",&x[i]); if(!flag&&ache+x[i]<0&&ache*x[i]<0){ flag=true; continue; //找到第一只被感染的了,千万不能break,因为要继续输入啊 } } for(int i=0;i<n-1;i++){ if((ache+x[i]<0&&ache*x[i]<0)||(flag&&ache*x[i]>0&&ache-x[i]>0))cnt++; } printf("%d",flag?cnt:1);//初始已经有一只被感染了哦 return 0; } /* 5 20 4 -3 -10 -22 */
边完善自己边认识自己