[OpenJudge 3064]坠落的蚂蚁

试题描述

一根长度为1米的木棒上有若干只蚂蚁在爬动。它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右。如果两只蚂蚁碰头,则它们立即交换速度并继续爬动。三只蚂蚁碰头,则两边的蚂蚁交换速度,中间的蚂蚁仍然静止。如果它们爬到了木棒的边缘(0或100厘米处)则会从木棒上坠落下去。在某一时刻蚂蚁的位置各不相同且均在整数厘米处(即1,2,3,…99厘米),有且只有一只蚂蚁A速度为0,其他蚂蚁均在向左或向右爬动。给出该时刻木棒上的所有蚂蚁位置和初始速度,找出蚂蚁A从此时刻到坠落所需要的时间。

输入

第一行包含一个整数表示蚂蚁的个数N(2<=N<=99),之后共有N行,每一行描述一只蚂蚁的初始状态。每个初始状态由两个整数组成,中间用空格隔开,第一个数字表示初始位置厘米数P(1<=P<=99),第二个数字表示初始方向,-1表示向左,1表示向右,0表示静止。

输出

蚂蚁A从开始到坠落的时间。若不会坠落,输出“Cannot fall!”

输入示例

4
10 1
90 0
95 -1
98 -1

输出示例

98

数据规模及约定

见“输入

题解

如果不考虑蚂蚁的编号,观察当两只蚂蚁撞上后调换方向其实和互相穿过没什么区别,所以能掉出去的蚂蚁一定会在 100 步内掉出(我们可以假设蚂蚁可以互相穿过,那么最晚掉下去的蚂蚁要么是开始时最左边向右走的或是最右边向左走的,而它们掉下去的步数显然不会超过 100)。

那么就暴力模拟 100 步咯。(有许多细节,不如拆成 200 步走,即每两个时刻的正中间再加一个时刻。)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std;

const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
    if(Head == Tail) {
        int l = fread(buffer, 1, BufferSize, stdin);
        Tail = (Head = buffer) + l;
    }
    return *Head++;
}
int read() {
    int x = 0, f = 1; char c = getchar();
    while(!isdigit(c)){ if(c == ‘-‘) f = -1; c = getchar(); }
    while(isdigit(c)){ x = x * 10 + c - ‘0‘; c = getchar(); }
    return x * f;
}

#define maxn 110
int n;
struct Ant {
	int x, v, id;
	bool has, pau;
	Ant() {}
	Ant(int _, int __, int ___): x(_), v(__), id(___) {}
	void Move() {
		if(!pau) x += v;
		pau = 0;
		return ;
	}
	bool operator < (const Ant& t) const { return x != t.x ? x < t.x : v < t.v; }
} as[maxn];
bool cmp(Ant a, Ant b) { return a.id < b.id; }

int main() {
//	freopen("data.in", "r", stdin);
	while(scanf("%d", &n) == 1) {
		int tar;
		for(int i = 1; i <= n; i++) {
			int a = read(), b = read();
			as[i] = Ant(a << 1, b, i); as[i].has = 1;
			if(!as[i].v) tar = i;
		}

		bool ok = 0;
		for(int i = 1; i <= 200; i++) {
			for(int j = 1; j <= n; j++) as[j].Move();
			sort(as + 1, as + n + 1);
			for(int j = 1; j <= n; j++) if(as[j].has) {
				if(as[j].x == 0 || as[j].x == 200) {
					if(as[j].id == tar){ printf("%d\n", i >> 1); ok = 1; break; }
					as[j].has = 0;
				}
				else if(as[j].x == as[j+1].x && as[j+1].x == as[j+2].x) swap(as[j].v, as[j+2].v), sort(as + j, as + j + 3), j++;
				else if(as[j].x == as[j+1].x) swap(as[j].v, as[j+1].v), sort(as + j, as + j + 2);
			}
			if(ok) break;
//			sort(as + 1, as + n + 1, cmp);
//			for(int j = 1; j <= n; j++) if(as[j].x < 10) printf("%d %d %d\n", as[j].id, as[j].x, as[j].v); putchar(‘\n‘);
		}

		if(!ok) puts("Cannot fall!");
	}

	return 0;
}
时间: 2024-10-06 05:53:58

[OpenJudge 3064]坠落的蚂蚁的相关文章

九度oj 题目1159:坠落的蚂蚁

题目描述: 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如果两只蚂蚁碰头,则它们立即交换速度并继续爬动.三只蚂蚁碰头,则两边的蚂蚁交换速度,中间的蚂蚁仍然静止.如果它们爬到了木棒的边缘(0或100厘米处)则会从木棒上坠落下去.在某一时刻蚂蚁的位置各不相同且均在整数厘米处(即1,2,3,…99厘米),有且只有一只蚂蚁A速度为0,其他蚂蚁均在向左或向右爬动.给出该时刻木棒上的所有蚂蚁位置和初始速度,找出蚂蚁A从此时刻到坠落所需要的时间. 输

为什么蚂蚁怎么都摔不死?

北冥有鱼 ,理论物理Ph.D. 3208 人赞同 谢邀.有一个数学定律保证了这只蚂蚁从高空摔下来不会摔死.这个定律的数学非常简单,大家都能懂,它叫做“平方-立方定律(Square-cube law)”. 这个是一个广泛应用的数学原理,它描述了物体表面积随着体积变化的规律.具体内容是:当物体尺寸变大时,体积按三次幂增加,而表面积按二次幂增加,也就是说,它的体积增长比表面积增长更快.别看这个定律简单,它的应用可不少. 在生物学中,肌肉的截面按二次幂增大,而肌肉的质量却是按三次幂增大.因为肌肉的强度跟

多个蚂蚁过独木桥,求通过的最长时间和最短时间

首先对题目进行分析: 求最长时间也就是最后掉下去的一只蚂蚁需要经历的最长时间: 求最短时间也就是最后掉下去的一只蚂蚁需要经历的最短时间:所以让所有的蚂蚁都向距离它们最近的那一段走,这样它们每个走的时间是短的,再求它们中用时最短的那个时间: 分析最长时间如下图所示: /************************************************************************* > File Name: 162.cpp > Author: > Mail:

蚂蚁问题

最近做了几个蚂蚁问题,还蛮有趣的..... 蚂蚁问题第一弹:poj 1852 Ants: Ants Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12214   Accepted: 5366 Description An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. When a w

[OpenJudge] 百练2754 八皇后

八皇后 Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题一共有92组解(即92个不同的皇后串).给出一个数b,要求输出第b个串.串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小. I

2017辽宁冬令营-4.蚂蚁

蚂蚁(ant.pas/c/cpp)题目大意在平面上有 N 只蚂蚁 N 个树洞,每个树洞只能容纳下一只蚂蚁,蚂蚁们都是直线行走的. 现在蚂蚁们希望能进入树洞中, 希望你能构造出一种方案使得任意两个蚂蚁的路线不相交.保证不会出现三点共线的情况.对于有多种不同的解,输出任意一组即可.无解时,输出-1.输入文件输入文件为 ant.in.第一行为一个数 N.接下来 N 行,每行两个非负整数,第 i+1 行为第 i 号蚂蚁的坐标.接下来 N 行,每行两个非负整数,第 i+N+1 行为第 i 号树洞的坐标.输

[zz]蟑螂蚂蚁蚊子已不住在我家了!这个方法100%见效…

http://mt.sohu.com/20150324/n410238511.shtml 蚂蚁怕酸,蚊子怕辣,蟑螂怕香.在下给各位提供一个不杀生又能驱赶蚂蚁.蚊子.蟑螂的妙法. 一.蚂蚁怕酸味 家里的甜食摆没几分钟,蚂蚁大军立即来袭,让人又气又厌,献给各位一项无毒无污染又安全有效的妙招: 整粒的新鲜柠檬,对切成两半,在看得到蚂蚁的地方及其动线,挤出柠檬汁,并拿着切半有果肉的那一面,沿途涂抹,神奇效果让您再一次验证大自然的奥妙! 二.蚊子怕辣味 蒜头呛退.将蒜头分植于花坛四周,其特殊的辛辣味隐隐飘

懒蚂蚁效应:成功的秘诀在于懒于杂物,勤于思考

概念:懒蚂蚁效应 日本北海道大学进化生物研究小组对一群黑蚂蚁进行了研究.他们把蚂蚁分为三个小组,每组30只,观察他们的行为.研究人员发现,大部分蚂蚁都很勤快地工作,寻找.搬运食物,但是却有少部分蚂蚁好像整天无所事事一样地东张西望. 研究人员在这群蚂蚁身上做上标记,并把这群蚂蚁称为:懒蚂蚁,然后,断绝了整个蚁群的食物来源.有趣的是,这时候那些平时工作很勤快的蚂蚁,突然都不知所措了,而那些"懒蚂蚁"们却挺身而出,带领蚂蚁们向他们侦查到的其它食物转移. 原来,这些"懒蚂蚁"

蓝桥--兰顿蚂蚁

兰顿蚂蚁 时间限制:1.0s   内存限制:256.0MB 问题描述 兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其中一格正方形内有一只“蚂蚁”. 蚂蚁的头部朝向为:上下左右其中一方. 蚂蚁的移动规则十分简单: 若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格: 若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格. 规则虽然简单,蚂蚁的行为却十分复杂.刚刚开始时留下的路线都会有接近对称,像是会重复,但不论起始状态如何,