蓝桥杯 [蚂蚁感冒] 思维

题目链接: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
*/

 

posted @ 2017-07-25 23:30  哇咔咔咔  阅读(228)  评论(0编辑  收藏  举报