题目描述:

一根长度为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

这道题真的是又绕又难。一开始读题不认真,就没有搞清楚A蚂蚁到底指什么,最后才发现是“有且只有一只蚂蚁A速度为0”,这A也太隐蔽了吧!
之后研究题目的内容,题目似乎在讲述动量守恒定律。若B蚂蚁撞了A蚂蚁,那么A蚂蚁就会像B蚂蚁一样运行下去。
那么我们来研究一下A蚂蚁掉落的条件,一定有一只B蚂蚁撞了A蚂蚁,如果A前进的路上还有一只C蚂蚁,那么A会返回来直到碰上B.然后A会停下来,B的速度传给了C,C的速度传给了B.C和B对A的作用相互抵消了。
向下推之,若A两侧有相同数目相向运动的蚂蚁,则A就不会掉下。
若A两侧相向运动蚂蚁数目不相同,那么多的那一侧(抵消掉相同的后)离A最近的蚂蚁M会把它的速度传递给A,然后A就会掉下。
那么这个时间其实就是M运动至边界的时间。 注意只有在A两侧相向运动的蚂蚁才是有效的蚂蚁,其余都要忽略,另外速度为0的蚂蚁只有一只。
代码如下
 #include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
using namespace std; struct Ant
{
int pos;
int dir;
};
Ant ant[];
int pos[]; int cmp(const void *a, const void *b) {
Ant at = *(Ant *)a;
Ant bt = *(Ant *)b;
return at.pos - bt.pos;
} int main(int argc, char const *argv[])
{
int n;
freopen("input.txt","r",stdin);
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d %d",&ant[i].pos, &ant[i].dir);
}
qsort(ant, n, sizeof(Ant), cmp);
int left = ;
int right = ;
int Apos;
int state = ;
int j = ;
for(int i = ; i < n; i++) {
if(state == && ant[i].dir == ) {
pos[j++] = ant[i].pos;
left++;
}
else if(state == && ant[i].dir == ) {
state = ;
Apos = j;
pos[j++] = ant[i].pos; }
else if(state == && ant[i].dir == -) {
pos[j++] = ant[i].pos;
right++;
}
}
if(left == right) {
puts("Cannot fall!");
continue;
}
else if(left > right) {
int tmp = left - right;
int ans = - pos[tmp-];
printf("%d\n",ans);
}
else {
int tmp = right - left;
int ans = pos[Apos + left+];
printf("%d\n",ans);
}
}
return ;
}

九度oj 题目1159:坠落的蚂蚁的更多相关文章

  1. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  2. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  4. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  5. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  6. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  7. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  8. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

  9. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

随机推荐

  1. kafka安装和使用

    kafka安装和启动 kafka的背景知识已经讲了很多了,让我们现在开始实践吧,假设你现在没有Kafka和ZooKeeper环境. Step 1: 下载代码 下载0.10.0.0版本并且解压它. &g ...

  2. 【读书笔记】构建之法(CH7~CH8)

    MSF九大原则: 1. 推动信息共享与沟通:“谐”,Alert 2. 为共同的远景而工作:目标明确—用户/老板 3. 充分授权和信任: 4. 各司其职,对项目共同负责: 5. 交付增量的价值: 6. ...

  3. nconf修改密码

    修改nconf登录界面密码 [root@Cnyunwei config]# vi .file_accounts.php <?php/*## User/Password file for simp ...

  4. [总结].net操作MongoDb通用基础类1:

    public class MongoDBHelper { //定义Mongo服务 private MongoServer mongo = null; //获取databaseName对应的数据库,不存 ...

  5. 洛谷 P2935 [USACO09JAN]最好的地方Best Spot

    题目描述 Bessie, always wishing to optimize her life, has realized that she really enjoys visiting F (1 ...

  6. 在Mac里给Terminal终端自定义颜色

    Mac里终端显示默认是一种颜色,太单调了. 然而我们可以自定义这些颜色显示.进入-目录,编辑文件.bash_profile, 输入如下内容: 第三行那些fxfxax看起来是不是像天书?实际上是有规律的 ...

  7. Python进程间通信和网络基础

    Python进程间通信和网络基础 Python支持多种进程间通讯的方式, 有单机通信的signal和mmap等, 也有可以通过网络的socket方式, 这里先介绍select等的有关知识, socke ...

  8. Luogu P5349 幂

    大力数学题,发现自己好久没写多项式水平急速下降,求逆都要写挂233 首先看到关于多项式的等比数列求和,我们容易想到先求出每一项的系数然后最后累加起来即可,即设\(f_i=\sum_{n=0}^{\in ...

  9. 团队作业-Beta冲刺第二天

    这个作业属于哪个课程 <https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1> 这个作业要求在哪里 <https ...

  10. JavaScript异步仿同步(控制流)的实现

    在前端开发中尤其是在nodejs开发中经常会遇到这样的场景(以ajax为例):有3个(或者更多个)Ajax请求,并且第2个请求依赖于第1个,第3个请求依赖于第2个,那我们可能就会在发第一个Ajax后回 ...