分析
首先我们必须要明白两只蚂蚁相撞掉头可以看作时一只蚂蚁穿过了另一只蚂蚁,因为相撞之后两只蚂蚁都感冒了,掉不掉头其实无所谓,毕竟都感冒了,这样的话这题就简单多了。我们先不考虑特殊情况,先来看看一般情况:
第一只蚂蚁不管方向朝哪里,只要它右边的蚂蚁向左走就可能碰撞感染,同样,第一只蚂蚁左边的蚂蚁只要朝右边走也可能被感染,这样就很容易得到$ans=right+left+1$。这里$left$表示左边蚂蚁向右走的数量,$right$表示右边蚂蚁向左走的数量,$1$是指第一只蚂蚁本身。
还有一种特殊情况,就是当第一只蚂蚁向左走的时候,如果第一只蚂蚁左边没有向右爬行的蚂蚁,由于爬行速度相同,所以不管第一只蚂蚁右边有多少向左爬行的,其右边的蚂蚁永远不可能被感染。同理,当第一只蚂蚁向右走的时候,如果第一只蚂蚁右边没有向左爬行的蚂蚁,其左边也永远不可能感染。
C++ 代码
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n;
int main()
{
scanf("%d", &n);
int pivot, left = 0, right = 0;
scanf("%d", &pivot);
for (int i = 1; i < n; i++)
{
int x;
scanf("%d", &x);
//找到感冒蚂蚁左边边且向右走的
if (abs(x) < abs(pivot) && x > 0) right++;
//找到感冒蚂蚁右边且向左走的
if (abs(x) > abs(pivot) && x < 0) left++;
}
//特殊情况
if ((pivot < 0 && right == 0) || pivot > 0 && left == 0) puts("1");
else printf("%d\n", left + right + 1);
return 0;
}
思路很巧妙,可是这好难想到啊(对于我这个蒟蒻来说。。)
严重怀疑此题的灵感来自于物理的多个小球碰撞的模型
完全弹性碰撞
绳子的长度,蚂蚁的速度,都是虚的,只有方向和位置是实的,需要我们考虑的
这代码思想能想出来的都是历害人!
talent
“两只蚂蚁相撞掉头可以看作时一只蚂蚁穿过了另一只蚂蚁”,这句话太赞了,自己想的时候就忽略了两个蚂蚁相撞,将其等效为相撞不影响原本左右方向的数量,尽管写出来了还是感觉不是那么透彻。
我说怎么回事,简单题?直到看了你的思路
为什么感冒蚂蚁右边的蚂蚁向左走就被传染啊?如果他自己也向左走呢?
有意思
很厉害,我只想到只与方向和位置有关,没想到要想成穿越
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
using namespace std;
const int N=60;
int a[N];
int n;
int main()
{
cin >> n;
for(int i = 0;i < n;i) scanf(“%d”,&a[i]);
int right=0,left=0;//分别表示从又向左和从左向又的蚂蚁数量
for(int i = 0;i [HTML_REMOVED]0&&abs(a[i])[HTML_REMOVED]abs(a[0])) right;
}
//感冒蚂蚁向右走,但没有向左走的蚂蚁,感冒蚂蚁向左走,没有向右走的蚂蚁输出
if(a[0]>0&&right==0||a[0]<0&&left==0) cout << 1<< endl;
// 除了那两种情况下的剩余情况
else cout << right+left+1<< endl;
return 0;
}
tql大佬
思路想到了大部分
思路清晰
牛
妙啊!爱了爱了
找到左边向右走和右边向左走的为什么一定要加上绝对值呢?
因为这是一个1-100的杆子 xi的绝对值表示的才是第xi个蚂蚁的坐标
这里left表示左边蚂蚁向右走的数量,right表示右边蚂蚁向左走的数量,11是指第一只蚂蚁本身。
//找到感冒蚂蚁左边边且向右走的
if (abs(x) < abs(pivot) && x > 0) right;
//找到感冒蚂蚁右边且向左走的
if (abs(x) > abs(pivot) && x < 0) left;
是不是写反了??
秒
这也太妙了吧