poj_2674 弹性碰撞
题目大意
给定一条直线,长度为L 表示区间[0, L]。在直线上开始放置N个人,每个人有一个初始位置pos(用到直线上端点0的距离表示)和初始方向dir('p' 或 'P' 表示向端点L行走, 'n'或'N'表示向端点0行走),然后所有的人都开始沿着自己的方向用相同的速度v行走,若走到端点0或端点L,则此人掉下去;若两个方向相反的人碰到一起,则分别掉头,继续行走(速度不变)。
求出最后掉下去的人,和掉下去的时间。
题目分析
弹性碰撞的问题,如果只是求最后掉下的时间,由于碰撞只是交换方向,速度不变,因此可以视为两个人只是“擦肩而过”,各自的速度方向均未发生变化,这样转换之后的整体的效果和之前的整体的效果是一样的。那么,求最后掉下的时间就可以直接求每个人走到各自方向的端点所需要的时间,然后求最大值即可。此时,记录获得最大值的人为A。
然而此题还需要求最后掉下去的人是谁,那么最后掉下去的人肯定就是和A碰撞过的人一直不停的碰撞的最后一个人。即,若A和B碰撞,之后B又和C碰撞,之后C又和.... 的最后一个人。
可以按照初始位置对N个人进行排序,找出从A到A方向的端点之间和A方向相反的人的个数count,可以画图得知,从A开始,沿着A的方向的第count个人,就是最后和A碰撞之后的人碰撞的那个人,输出即可。
实现(c++)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<cmath>
#include<iostream>
using namespace std;
#define MAX_N 32005
#define max(a, b) a >b?a:b
double gStartPos[MAX_N];
int gPre[MAX_N];
struct Person{
int dir;
double start_pos;
char name[255];
};
Person gPerson[MAX_N];
bool Cmp(const Person& p1, const Person& p2){
return p1.start_pos < p2.start_pos;
} int main(){
int n;
double l, v;
while (cin >> n && n){
cin >> l >> v;
char dir;
double max_t = 0;
int max_id;
for (int i = 0; i < n; i++){
cin >> dir >> gPerson[i].start_pos >> gPerson[i].name;
gPerson[i].dir = ((dir == 'p' || dir == 'P')? 0 : 1);
}
sort(gPerson, gPerson + n, Cmp);
for (int i = 0; i < n; i ++){
if (gPerson[i].dir == 1){
if (max_t < gPerson[i].start_pos / v){
max_t = gPerson[i].start_pos / v;
max_id = i;
}
}
else{
if (max_t < (l - gPerson[i].start_pos) / v){
max_t = (l - gPerson[i].start_pos) / v;
max_id = i;
}
}
}
int count = 0;
int id = 0;
if (gPerson[max_id].dir == 0){
for (int i = max_id + 1; i < n; i++){
if (gPerson[i].dir == 1){
count++;
}
}
id = max_id + count;
}
else{
for (int i = 0; i < max_id; i++){
if (gPerson[i].dir == 0){
count++;
}
}
id = max_id - count;
}
//!!!! 截断小数,取后两位,而不是四舍五入!
printf("%13.2lf %s\n", int(max_t*100)/100.0, gPerson[id].name);
}
return 0;
}
poj_2674 弹性碰撞的更多相关文章
- Greedy:Physics Experiment(弹性碰撞模型)(POJ 3848)
物理实验 题目大意:有一个与地面垂直的管子,管口与地面相距H,管子里面有很多弹性球,从t=0时,第一个球从管口求开始下落,然后每1s就会又有球从球当前位置开始下落,球碰到地面原速返回,球与球之间相碰会 ...
- 第七讲:HTML5中的canvas两个小球全然弹性碰撞
<html> <head> <title>小球之间的碰撞(全然弹性碰撞)</title> <script src="../js/jsce ...
- python开发_tkinter_小球完全弹性碰撞游戏
python开发_tkinter_小球完全弹性碰撞游戏 完成这个小球的完全弹性碰撞游戏灵感来自于: 下面是我花了一周下班时间所编写的一个小球完全弹性碰撞游戏: 游戏初始化状态: 最下面的游标和修改 ...
- pygame系列_小球完全弹性碰撞游戏
之前做了一个基于python的tkinter的小球完全碰撞游戏: 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名称: 小球完全弹性碰撞游戏规则: 1.游戏初始化的时候,有5个不同 ...
- Physics Experiment 弹性碰撞 [POJ3684]
题意 有一个竖直的管子内有n个小球,小球的半径为r,最下面的小球距离地面h高度,让小球每隔一秒自由下落一个,小球与地面,小球与小球之间可视为弹性碰撞,让求T时间后这些小球的分布 Input The f ...
- 【AGC013C】Ants on a Circle 弹性碰撞
题目大意 一个长度为\(lm\)的环上有\(n\)只蚂蚁,告诉你每只蚂蚁的位置和朝向,每只蚂蚁会向前爬,速度为\(1m/s\),两只蚂蚁相遇后都会掉头,问你\(t\)秒后每只蚂蚁的位置. \(n\le ...
- pygame系列_小球完全弹性碰撞游戏_源码下载
之前做了一个基于python的tkinter的小球完全碰撞游戏: python开发_tkinter_小球完全弹性碰撞游戏_源码下载 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名 ...
- python开发_tkinter_小球完全弹性碰撞游戏_源码下载
完成这个小球的完全弹性碰撞游戏灵感来自于: 下面是我花了一周下班时间所编写的一个小球完全弹性碰撞游戏: 游戏初始化状态: 最下面的游标和修改小球的移动速度 ====================== ...
- POJ 2674 Linear world(弹性碰撞)
Linear world Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 4426 Accepted: 1006 Desc ...
随机推荐
- Session解析
1.除非关闭所有页面 或者超时session才销毁 2.在几个页面之间切换的时候 session保存用户状态. 3.遍历数组时候for循环中从0开始小于长度,不等于长度,用Matlab用习惯了,竟然从 ...
- dijkstra,SPFA,Floyd求最短路
Dijkstra: 裸的算法,O(n^2),使用邻接矩阵: 算法思想: 定义两个集合,一开始集合1只有一个源点,集合2有剩下的点. STEP1:在集合2中找一个到源点距离最近的顶点k:min{d[k] ...
- UVA 1626 Brackets sequence(括号匹配 + 区间DP)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/E 题意:添加最少的括号,让每个括号都能匹配并输出 分析:dp ...
- Spring学习8- SSH需要的jar包
struts2 commons-logging-1.0.4.jar 主要用于日志处理 freemarker-2.3.8.jar 模板相关操作需要包 ognl-2.6.11.jar ognl表达示所需包 ...
- 使用servletAPI三种方式简单示例
一.直接实现Action接口或集成ActionSupport类(推荐) public class HelloAction implements Action { @Override public St ...
- 模拟创建类变量,static变量加类方法,单例
@interface Model + (int) value; + (void) setValue:(int)val; @end @implementation Model static int va ...
- linux 多线程 LinuxThreads(转)
Linux 线程实现机制分析 http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 上面文章分析的非常透彻 按照教科书上的定义,进程是 ...
- windows2008R2安全加固
一.更改终端默认端口号 步骤: 1.运行regedit 2.[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\W ...
- php获取当前方法名和类名
php提供的一些系统常量可以完成这些 php获取当前方法名(函数名) __FUNCTION__ php获取当前类名 __CLASS__ 或者 get_class($this); php获取本类所有的方 ...
- Quartz.net开源作业调度框架使用详解(转)
前言 quartz.net作业调度框架是伟大组织OpenSymphony开发的quartz scheduler项目的.net延伸移植版本.支持 cron-like表达式,集群,数据库.功能性能强大更不 ...