zoukankan      html  css  js  c++  java
  • 蓝桥杯历届试题 蚂蚁感冒(模拟+细分)

    蚂蚁感冒   

    时间限制:1.0s     内存限制:256.0MB
         
    问题描述
      长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。

      每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。

      当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。

      这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。

      请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
    输入格式
      第一行输入一个整数n  (1  <   n  <   50),  表示蚂蚁的总数。

      接着的一行是n个用空格分开的整数  Xi  (-100  <   Xi  <   100),  Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数  据代表的蚂蚁感冒了。
    输出格式
      要求输出1个整数,表示最后感冒蚂蚁的数目。
    样例输入
    3
    5  -2  8
    样例输出
    1
    样例输入
    5
    -10  8  -20  12  25
    样例输出
    3

     1 /*
     2 问题  在一根100厘米的杆子上,有n只蚂蚁以1cm/s的速度前行,它们朝向不同,当碰头的石头调转方向继续前行,
     3 直到爬离杆子(两端都可以)。有一只感冒的蚂蚁,当他们相互碰头的时候会将感冒传染给对方,问n只蚂蚁
     4 都爬离杆子的时候有多少只蚂蚁感冒了。
     5 解题思路  刚开始的时候以为蓝桥杯的题就开始模拟,但是忘记考虑了一种特殊情况,就是相差1cm的时候,就应该立即
     6 掉头,而我判断的时候,直接错开了。后来采用细分的方法,将所有蚂蚁的位置扩大2倍,每次走1cm,再扩大边界就可以了。 
     7 */ 
     8 #include<cstdio>
     9 #include<cstring>
    10 #include<algorithm>
    11 #include<iostream>
    12 #include<cmath>
    13 using namespace std;
    14 
    15 struct ANT{
    16     int x,g,c,f;
    17 }ants[65];
    18 
    19 bool cmp(ANT a, ANT b){
    20     return a.x < b.x;
    21 }
    22 
    23 int main()
    24 {
    25     int n,i;
    26     while(scanf("%d",&n) != EOF){
    27         for(i=1;i<=n;i++){
    28             scanf("%d",&ants[i].x);
    29             if(ants[i].x < 0)
    30                 ants[i].f=1;
    31             else 
    32                 ants[i].f=0;
    33             ants[i].x=abs(ants[i].x)*2;
    34         }
    35         for(i=1;i<=n;i++)
    36             ants[i].g=ants[i].c=0;
    37         ants[1].g=1;//排序之前先标记第一只感冒 
    38         
    39         sort(ants+1,ants+n+1,cmp);
    40 
    41         int cou=0;
    42         while(1){
    43             for(i=1;i<=n;i++){
    44                 if(ants[i].c == 0){
    45                     if(ants[i].f == 1)
    46                         ants[i].x--;
    47                     else
    48                         ants[i].x++;
    49                     
    50                     if(ants[i].x <= 0 || ants[i].x >= 200){
    51                         ants[i].c=1;
    52                         cou++;
    53                     }
    54                 }
    55             }
    56             if(cou == n)
    57                 break;
    58             for(i=1;i<=n-1;i++){
    59                 if(ants[i].c ==0 && ants[i+1].c == 0 && ants[i].x == ants[i+1].x){
    60                     //printf("%d和%d相遇
    ",i,i+1);
    61                     ants[i].f = ants[i].f == 0? 1:0;
    62                     ants[i+1].f = ants[i+1].f == 0?1:0;
    63                     if(ants[i].g || ants[i+1].g){
    64                         //printf("%d和%d感染
    ",i,i+1);
    65                         ants[i].g=1;
    66                         ants[i+1].g=1;
    67                     }
    68                 }
    69             }
    70         }
    71         
    72         int ans=0;
    73         for(i=1;i<=n;i++){
    74             if(ants[i].g)
    75                 ans++;
    76         }
    77         printf("%d
    ",ans);
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    Android layout属性大全
    如何看懂Code128条形码
    二维码
    在线条形码生成器
    GS1已分配给国家(地区)编码组织的前缀码
    POJ 3321 Apple Tree DFS序+fenwick
    bootstrap之WaitForIdle&amp;&amp;Clear
    ubuntu14操作系统chrome标签和书签乱码解决
    动态规划-hdoj-4832-百度之星2014初赛第二场
    截取符合指数分布的一部分样本的理论与实验
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/8653520.html
Copyright © 2011-2022 走看看