题目描述
emmm,这里就不赘述了。
样例
附赠的样例
5
-6 7 1 5 -8
答案
4
算法1
利用蚂蚁行走的特性解【大部分人用的这个】
参考文献中算法解释的很详细了,这里就不多介绍了。主要看第二种解法
参考文献
https://www.acwing.com/solution/content/7077/
算法2
模拟
就是模拟蚂蚁走路,这题由于蚂蚁的初始位置都是整数,所以可以直接得出每次模拟行走的最小时间单位为0.5秒,在这0.5秒内不可能会有蚂蚁相遇,如果想不通不要紧看下面。
假如所有的蚂蚁都是相邻分布在这个杆子上,方向随意。现在拿出一小段(3个)来看
3 -4 -5
先看经过一秒,发现第一只蚂蚁和第二只蚂蚁在1秒中间的时候相遇了,那么下来就看0.5秒的时候
3.5 -3.5 -4.5
此时前二者相遇,掉头。在经过0.5秒(这0.5秒间无再次相遇),第1,2只返回到它原来的位置了
-3 4 -4
此时又是全为整数的情况。而蚂蚁的最小初始间距也只能是1。由此可以推想出最小的时间单位为0.5.在0.5秒内(不包含0.5)没有蚂蚁会相遇。
接着就是模拟行走了。
以0.5秒为1轮开始遍历,令每只蚂蚁的坐标改变后,进行判断是否相遇,相遇掉头,后判断相遇时是否只有一只生病,若是那就让另一只也生病。
当所有的蚂蚁都出去的时候停止模拟
参考文献
我自己
C++ 代码
#include <iostream>
#include <cstring>
using namespace std;
#define the_smallest_unit 0.5
int main()
{
int ant_count;
int i, j, k;
double d[100] = { 0 };
bool cold[100] = { 0,1 };
int finish = 0, ans=1;
cin >> ant_count;
for (i = 1; i <= ant_count; i++)
{
cin >> d[i];
}
while (1)//不断循环直至结束
{
//不断遍历,要是蚂蚁全不在这个杆上,就说明已经结束了,要输出答案了
finish = 0;
for (i = 1; i <= ant_count; i++)//逐个遍历
if (abs(d[i]) <= 0 || abs(d[i]) >= 100)//绝对值判断是否正在杆上
finish++;//在就加一
if (finish == ant_count)//达到目标退出
break;
//接下来挨个蚂蚁走路,以0.5为单位,达到0或是100就不必再走
for (i = 1; i <= ant_count; i++)//走一单位
{
if (d[i] != 0 && d[i] != 100)
d[i] += 0.5;
}
for (i = 1; i <= ant_count; i++)//进行相遇判断,每次选两个都在杆上的蚂蚁判定绝对值是否相等
{
if(d[i]!=0&&d[i]!=100)
for (j = i + 1; j <= ant_count; j++)
{
if (d[j] != 0 && d[j] != 100)
{
if (abs(d[j]) == abs(d[i]))//相遇就掉头,并且判断二者是否有一只蚂蚁得病,有就让另一只也病
{
d[j] = -d[j];
d[i] = -d[i];
if (cold[i] && !cold[j])
{
ans++;
cold[j] = 1;
}
if (cold[j] && !cold[i])
{
ans++;
cold[i] = 1;
}
}
}
}
}
}
cout << ans << endl;
return 0;
}
*完结撒花*
狠人啊
while (1)//不断循环直至结束
{
//不断遍历,要是蚂蚁全不在这个杆上,就说明已经结束了,要输出答案了
finish = 0;
为什么finish=0要放在while里面?没有想明白
头像吸引人
冲你头像进来
模拟的写麻了
正是我想要的思路,和我想的一样,但不知道怎么下手 ,tql!
Orz
手动滑稽