zoukankan      html  css  js  c++  java
  • ACwing1211. 蚂蚁感冒

    题目:
    长 100 厘米的细长直杆子上有 n 只蚂蚁。

    它们的头有的朝左,有的朝右。

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

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

    这些蚂蚁中,有 1 只蚂蚁感冒了。

    并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。

    请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

    输入格式
    第一行输入一个整数 n, 表示蚂蚁的总数。

    接着的一行是 n 个用空格分开的整数 Xi, Xi 的绝对值表示蚂蚁离开杆子左边端点的距离。

    正值表示头朝右,负值表示头朝左,数据中不会出现 0 值,也不会出现两只蚂蚁占用同一位置。

    其中,第一个数据代表的蚂蚁感冒了。

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

    数据范围

    1<n<50,
    0<|Xi|<100
    

    输入样例1:

    3
    5 -2 8
    

    输出样例1:

    1
    

    输入样例2:

    5
    -10 8 -20 12 25
    

    输出样例2:

    3
    

    思路:
    本题最重要的是想清楚、相撞之后调转方向、其实等价于直接穿过、理解到这里、这题就简单了、我们只需要考虑同一时间内、从左向右走的蚂蚁、和从右向左走的蚂蚁、将它们的个数输出即为所求。当然、还要加上第一只被感染的蚂蚁。

    代码:

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    const int N = 55;
    
    int x[N];
    int n;
    int main()
    {
        cin >> n ;
        
        for(int i = 0 ; i < n ; i ++ ) cin >> x[i];
        
         //记录从左向右走的蚂蚁和从右向左走的蚂蚁、以第一支蚂蚁为界
        int left = 0, right = 0;
        for(int i = 1 ; i < n ; i ++)
            if(abs(x[i]) < abs(x[0]) && x[i] > 0) left ++;
            else if(abs(x[i]) > abs(x[0]) && x[i] < 0) right ++;
            
        if(x[0] > 0 && right == 0 || x[0] < 0 && left == 0) cout << 1 << endl;
        else cout << left + right + 1 << endl;
        
        return 0;
    }
    
  • 相关阅读:
    【每日一题】740. 删除并获得点数
    【每日一题】1473. 粉刷房子 III
    【每日一题】7. 整数反转
    【每日一题】554. 砖墙
    【每日一题】690. 员工的重要性
    【每日一题】137. 只出现一次的数字 II
    【每日一题】403. 青蛙过河
    【每日一题】633. 平方数之和
    【每日一题】938. 二叉搜索树的范围和
    a_lc_到达终点(数学优化)
  • 原文地址:https://www.cnblogs.com/xiaofrank/p/14320189.html
Copyright © 2011-2022 走看看