[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!”

输入示例


 -
-

输出示例


数据规模及约定

见“输入

题解

如果不考虑蚂蚁的编号,观察当两只蚂蚁撞上后调换方向其实和互相穿过没什么区别,所以能掉出去的蚂蚁一定会在 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;
}

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

  1. 九度OJ 1159:坠落的蚂蚁 (模拟、排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1098 解决:277 题目描述: 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如 ...

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

    题目描述: 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如果两只蚂蚁碰头,则它们立即交换速度并继续爬动.三只蚂蚁碰头,则两边的蚂蚁交换速度, ...

  3. [poj3046][Ant counting数蚂蚁]

    题目链接 http://noi.openjudge.cn/ch0206/9289/ 描述 Bessie was poking around the ant hill one day watching ...

  4. 【OpenJudge 8463】Stupid cat & Doge

    http://noi.openjudge.cn/ch0204/8463/ 挺恶心的一道简单分治. 一开始准备非递归. 大if判断,后来发现代码量过长,决定大打表判断后继情况,后来发现序号不对称. 最后 ...

  5. 【OpenJudge 191】【POJ 1189】钉子和小球

    http://noi.openjudge.cn/ch0405/191/ http://poj.org/problem?id=1189 一开始忘了\(2^{50}\)没超long long差点写高精度Q ...

  6. 【OpenJudge 1665】完美覆盖

    http://noi.openjudge.cn/ch0405/1665/?lang=zh_CN 状压水题,手动转移 #include<cstdio> #include<cstring ...

  7. 【OpenJudge 1793】矩形覆盖

    http://noi.openjudge.cn/ch0405/1793/ 好虐的一道题啊. 看数据范围,一眼状压,然后调了好长时间QwQ 很容易想到覆盖的点数作为状态,我用状态i表示至少覆盖状态i表示 ...

  8. OpenJudge 2990:符号三角形 解析报告

    2990:符号三角形 总时间限制:  1000ms       内存限制:  65536kB 描述 符号三角形的第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“ ...

  9. 蚂蚁【A001】

    [1005]出自附中练习场,其他编号(1005)[难度A]——————————————————————————————————————————————————————————————————————— ...

随机推荐

  1. ibatis中的$和#的区别

    介绍 在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型匹配,而$不进行数据类型匹配,例如: select * fr ...

  2. Ibatis中传List参数

    Ibatis中用list传参数的方式. Java代码  select count(id) from `user` where id in #[]# and status=1 . <select ...

  3. sublime text 删除安装的插件

    ctrl+shift+p输入remove package选择要删掉的插件即可

  4. 状态压缩dp问题

    问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...

  5. 畅所欲言第1期 - 从Viola&Jones的人脸检测说起

    转载自http://c.blog.sina.com.cn/profile.php?blogid=ab0aa22c890006v0 不少人认识我或者听说我的名字都是因为我过去做的关于人脸检测的工作,那么 ...

  6. hihocoder 1196 高斯消元.二

    传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中,小Hi和小Ho趁着便利店打折,买了一大堆零食.当他们结账后,看到便利店门口还有其他的活动. 店主:买了 ...

  7. 分享一段Java搞笑的代码注释

    今天在群里看到有人分享了一段搞笑的注释代码,觉得挺好玩的,在这里收藏一下 // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |) // ...

  8. static NSString *ID的改进

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPa ...

  9. [LeetCode] next_permutation

    概念 全排列的生成算法有很多种,有递归遍例,也有循环移位法等等.C++/STL中定义的next_permutation和prev_permutation函数则是非常灵活且高效的一种方法,它被广泛的应用 ...

  10. WIN 2003服务器终极安全及问题解决方案

    一.硬盘分区与操 作系统的安装硬盘分区 总的来讲在硬盘分区上面没什么值得深入剖析的地方,无非就是一个在分区前做好规划知道要去放些什么东西, 如果实在不知 道.那就只一个硬盘只分一个区,分区要一次性完成 ...