历届试题 蚂蚁感冒

    xiaoxiao2022-07-07  196

    题目链接                                           蓝桥杯---历届真题 题解

    问题描述

      长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。   每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。   当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。   这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。   请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

    方法一:模拟

    #include <iostream> #include <cstdlib> using namespace std; int a[55], c[55]; int main(int argc, char *argv[]) { int n; cin>> n; for(int i=0;i<n;i++) cin>> a[i]; int clod = 1; c[0] = 1; while( n > 0){ for(int i=0;i<n;i++){ a[i]++; if(a[i]==0 || a[i]==100){ a[i]=100; n--; } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(i!=j && a[i]<100 && abs(abs(a[i])-abs(a[j]))<=1){ a[i] = -a[i]; a[j] = -a[j]; if(c[i] + c[j] == 1){ c[i] = c[j] = 1; clod++; } } } } } cout<< clod; return 0; }

    方法二:

    掉头动作会让我们的逻辑变得混乱,因为谁也不知道什么时候会碰面,表面上看会无从下手,那么我们分析一下蚂蚁碰面后的状态。 1.两只健康蚂蚁碰面后,两个方向都会有一只健康的蚂蚁在行走 2.至少一只蚂蚁有病,两个方向都会有一只有病的蚂蚁在行走

    看出端倪了吧,其实蚂蚁碰面后根本没有必要掉头,或者说即使掉头,效果也是和不掉头一样的。

    明白了上面的,我知道,每只蚂蚁都会坚定不移的朝一个固定的方向走,下面看看第一只有病的蚂蚁,如果它初始向左走,那是不是它左边所有的向右走的蚂蚁都会遭殃?同样,当左边遭了秧的蚂蚁遇到了其右边向左走的蚂蚁,那么它们也会遭殃。

    存在一种特殊的情况,即所有的蚂蚁都朝一个方向走,那谁也不会被传染,最终只有一只蚂蚁有病。

    假设有病的蚂蚁是A,A左边向右走的蚂蚁数量为lf,A右边向左走的蚂蚁数量为rg,那么

    1.A向右走,且rg==0,;或者A向左走,且lf==0,ans=1; 2.ans=lf+rg+1; 原文:https://blog.csdn.net/wr132/article/details/50791505 

    #include <iostream> #include <stdio.h> #include <math.h> #include <algorithm> using namespace std; struct Ant { 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].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); 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++) { 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; }

    输入格式

      第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。   接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。

    输出格式

      要求输出1个整数,表示最后感冒蚂蚁的数目。

    样例输入

    3 5 -2 8

    样例输出

    1

    样例输入

    5 -10 8 -20 12 25

    样例输出

    3

    最新回复(0)