POJ 2674 Linear world(弹性碰撞)
| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 4426 | Accepted: 1006 |
Description
Not so long time ago people used to believe that they live on 2-D world and if they will travel long enough in one direction, they will fall down over the edge. Even when it was proved that the Earth is rounded some of them were still afraid to travel to the southern hemisphere.
Try to imagine one 1-D (linear) world. On such world there are only two possible directions (left and right). All inhabitants of such world were created exactly at the same time and suddenly all of them start to move (all with same constant velocity) in one or the other direction. If two inhabitants encounter each other, they politely exchange greetings and then they turn around and start to move in an opposite direction. When an inhabitant reaches the end of the world he falls away and disappears.
Your task is to determine, for a given scenario of creation, which inhabitant and when (counting from the moment of creation) will be the last one to fall away. You can assume that the time required to exchange greetings and turn around is 0.
Input
N
LV
DIR POS NAME
...
The first line defines the number of inhabitants (N<32000). Data set starting with value N=0 represents the end of the input file. The second line contains length of the world L(float) and velocity of inhabitants V(float). Both values are always positive. In next N lines the data about inhabitants are given in an order of increasing POS (positive direction):
DIR – initial direction ('p' or 'P' for positive and 'n' or 'N' for negative)
POS – position in the time of creation (0<=POS<=L)
NAME – name of inhabitant (string up to 250 characters)
Input values within one line are separated with at least one space and there will be no empty lines in input. You may assume that input is always correct and that each data set has only one unique solution.
Output
Sample Input
1
13.5 2
p 3.5 Smarty
4
10 1
p 1 Helga
n 3 Joanna
p 5 Venus
n 7 Clever
0
Sample Output
5.00 Smarty
9.00 Venus
Source
- 两人碰面后方向相反速度不变,可以认为两人只是交换了名字,
- 仍旧按原来的方向行走。那么只需找出距离端点最远的人,再
- 找出走到端点时此人的名字即可。怎么找出对应的名字呢,
- 只需找出此人走到尽头前遇到的方向相反的人数即可。
- 例如-> <- <- -> <-
- 1 2 3 4 5
- 假设第一个人是最远的,因为2,3,5与之方向相反,因此
- 他的名字将变化三次(5的方向和速度给4,5带着4的速度和方向
- 走到尽头,最后1依次与2,3,4交换)。可以看出1,5之间有
- 方向向右的并不影响(即使有多个也是一样的),1最终只交换
- 三次速度,因为有三人跟他方向相反。而且1最后用的名字一定是
- name[1+3],因为五个人的相对位置是不会变的,也就是说1只可能
- 与2相交换,变成2,而不可能直接与3交换,以此类推,因此最后
- 的名字一定是name[1+3].
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
struct node
{
char d[];
double dec;
char name[];
} c[];
bool cmp(const node& a,const node& b)
{
return a.dec<b.dec;
}
int main()
{
int n,i,j;
double L,V;
while(~scanf("%d",&n))
{
if(!n)break;
scanf("%lf%lf",&L,&V);
for(i=; i<=n; i++)
{
scanf("%s %lf %s",&c[i].d,&c[i].dec,&c[i].name);
}
sort(c+,c+n+,cmp);
int id;
double maL=;
for(i=; i<=n; i++)
{
double R;
if(c[i].d[]=='p'||c[i].d[]=='P')
R=L-c[i].dec;
else R=c[i].dec;
if(R>maL)
{
maL=R;
id=i;
}
}
int ans=;
if(c[id].d[]=='p'||c[id].d[]=='P')
{
for(j=id+; j<=n; j++)
if(c[j].d[]=='n'||c[j].d[]=='N')
ans++;
ans=id+ans;
}
else
{
for(j=id-; j>=; j--)
if(c[j].d[]=='p'||c[j].d[]=='P')
ans++;
ans=id-ans;
}
maL=maL/V;
printf("%13.2lf %s\n",floor(maL*)/100.00,c[ans].name);
}
return ;
}
思路:
很久之前做的一道思路题目了。 这个题比较坑把 记录一下。
两只蚂蚁碰面后相当于不回头一直往前走。
那么我们可以记录下来每只蚂蚁假如不碰面掉落的时间,取个最大值就是最后一只蚂蚁掉落的时间,在把那个时间对应的每只蚂蚁位置记录下来,还在线上的就是最后一只蚂蚁。
#include <iostream>
#include <cstdio>
using namespace std; const int N = ;
char name[N][]; int main()
{
int n;
double l, v; while (cin >> n && n)
{
cin >> l >> v;
int pnum = ;
double pmaxt = -, nmaxt = -;
char dir[];
double pos;
for (int i = ; i < n; i++)
{
scanf("%s%lf%s", dir, &pos, name[i]);
if (dir[] == 'p' || dir[] == 'P')
{
pnum++;
if (pmaxt < )//第一个人(最大的pmax)
pmaxt = (l - pos) / v;
}
else
{
nmaxt = pos / v;//最后一个人(最大的nmax)
}
}
//结果小数点2位之后的数是直接截断的,并不是四舍五入,因此不可以直接打印,要先处理再打印
if (pmaxt > nmaxt)
printf("%13.2lf %s\n", (int)(pmaxt * ) / 100.0, name[n - pnum]);
else
printf("%13.2lf %s\n", (int)(nmaxt * ) / 100.0, name[n - pnum - ]);
}
return ;
}
POJ 2674 Linear world(弹性碰撞)的更多相关文章
- POJ 2674 Linear world
POJ 2674 Linear world 题目大意: 一条线上N只蚂蚁,每只蚂蚁速度固定,方向和坐标不同,碰头后掉头,求最后掉下去那只蚂蚁的时间和名字. 注意两点: 相撞可视为擦肩而过,蚂蚁们不管掉 ...
- poj 2674 线性世界 弹性碰撞
弹性碰撞的题目一般都是指碰到就会掉转方向的一类题目,这里我们可以忽略掉头,仅仅看成擦肩而过,交换名字等等 题意:一条线上N只蚂蚁,每只蚂蚁速度固定,方向和坐标不同,碰头后掉头,求最后掉下去那只蚂蚁的名 ...
- Greedy:Linear world(POJ 2674)
Linear world 题目大意:一些人生活在线性世界中,到达线性世界两端就会消失,两个人的前进方向有两个,相遇会改变各自相遇方向,求最后一个人掉下的人的名字和时间. 其实这一题就是弹性碰撞的模 ...
- POJ 2674
Linear world Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 2448 Accepted: 564 Descr ...
- poj 3684 Physics Experiment 弹性碰撞
Physics Experiment Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1489 Accepted: 509 ...
- POJ:3684-Physics Experiment(弹性碰撞)
Physics Experiment Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3392 Accepted: 1177 Sp ...
- ProgrammingContestChallengeBook
POJ 1852 Ants POJ 2386 Lake Counting POJ 1979 Red and Black AOJ 0118 Property Distribution AOJ 0333 ...
- POJ 3684 Physics Experiment(弹性碰撞)
Physics Experiment Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2936 Accepted: 104 ...
- Greedy:Physics Experiment(弹性碰撞模型)(POJ 3848)
物理实验 题目大意:有一个与地面垂直的管子,管口与地面相距H,管子里面有很多弹性球,从t=0时,第一个球从管口求开始下落,然后每1s就会又有球从球当前位置开始下落,球碰到地面原速返回,球与球之间相碰会 ...
随机推荐
- LeetCode OJ:Jump Game II(跳跃游戏2)
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- 老鼠走迷宫(2)输出所有路径(C语言)
需求 有一个迷宫,在迷宫的某个出口放着一块奶酪.将一只老鼠由某个入口处放进去,它必须穿过迷宫,找到奶酪.请找出它的行走路径. STEP 1 题目转化 我们用一个二维数组来表示迷宫,用2表示迷宫的墙壁, ...
- IIS:连接数、并发连接数、最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数详解
Internet Information Services(IIS,互联网信息服务),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务.最初是Windows NT版本的可选 ...
- Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架
Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session import tornado.ioloop import tornado.web from myhas ...
- Makefile.am文件的实例讲解
Makefile.am是一种比Makefile更高层次的编译规则,可以和configure.in文件一起通过调用automake命令,生成Makefile.in文件,再调用./configure的时候 ...
- EasyDSS流媒体服务器实现RTMP直播同步HLS录像和时移回放
本文转自EasyDarwin团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/74166337 "目前在市面上可以找到的 ...
- 密钥库文件格式[keystore]代码
密钥库文件格式[keystore]代码 格式 : JKS 扩展名 : .jks/.ks 描述 : [Java Keystore]密钥库的Java实现版本,pro ...
- ICE:slice语言常识整理
ICE:Slice语言(二)--源文件和词法规则: 文件命名 Slice的源文件以.ice为扩展名. 对于大小写不区分的系统(例如DOS),文件的扩展名可以大写,也可以小写,例如Cli ...
- puremvc源码阅读
1.mediator作为ui管理器,是设计成可以list多个notification 2.所有ui想要监听notification,都需要register到facade中 3.puremvc只负责消息 ...
- Loj 2534 异或序列
Loj 2534 异或序列 考虑莫队离线处理.每加一个数,直接询问 \(a[x]\oplus k\) 的前/后缀数目即可,减同理. 利用异或的优秀性质,可以维护异或前缀和,容易做到每次 \(O(1)\ ...