《挑战程序设计竞赛》3.2.3 常用技巧-弹性碰撞 POJ3684 2674

本文主要是介绍《挑战程序设计竞赛》3.2.3 常用技巧-弹性碰撞 POJ3684 2674,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

POJ3684

http://poj.org/problem?id=3684

题意

将N个半径为R的球放入一个圆桶(圆桶口径刚好放入一个球),将圆桶竖直放着,最下端距离地面H高度,让球每隔一秒自由下落,求T时刻各个球距离地面的高度。

思路

将球最开始的位置均视为H,即忽略球本身的高度,这样球碰撞就可视为互相穿过继续运动。然后就可以分别单独求出每个球T时刻的高度后排序就是答案了。排序后再加上每个球原本高于高度h的值。
需要注意的地方:
(1)t可能小于n,需要特殊处理,不知道测试数据是否有涉及到。
(2)r给的值单位是cm,要换算成m。

代码

Source CodeProblem: 3684       User: liangrx06
Memory: 248K        Time: 0MS
Language: C++       Result: Accepted
Source Code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;int main(void)
{int c, n, t;double h, r, g = 10;double pos[100];cin >> c;while (c--) {cin >> n >> h >> r >> t;fill(pos, pos+n, h);double T = sqrt(2*h/g);for (int i = 0; i < n && i < t; i ++) {int t0 = (t-i)/T;double t1 = t-i - t0*T;if (t0 % 2 == 0)pos[i] -= (g*t1*t1/2);elsepos[i] -= (g*(T-t1)*(T-t1)/2);}sort(pos, pos+n);for (int i = 0; i < n; i ++)printf("%.2lf%c", pos[i]+2*i*r/100, (i==n-1) ? '\n' : ' ');}return 0;
}

POJ2674

http://poj.org/problem?id=2674

题意

题目大意是,在一个一维的世界里有N个居民在一条直线上的不同位置,他们以恒定的速度大小,速度方向可能不同进行运动,相遇后会返回,问给定线段的长度l,速度v,求最后一个走出这个范围的居民是谁,用时多少。

思路

这类弹性碰撞可视为直接穿过。举个例子,我们可以想象一下几个质量相同刚体(忽略他们的半径)在同一直线上运动,速度方向可能不同,所以会发生弹性碰撞,假设没有任何能量损耗的话,碰撞后是彼此交换速度后返回的,如果求在t时刻,这些球的位置该如何求。因为相遇后彼此交换了速度后返回,所以实际上相当于碰撞后各个球还是继续沿着原来的方向运动,所以可以求出t时刻这些刚体的分散在的位置,但是不能对上号,因为实际上发生碰撞后会返回的,但是注意一个细节就是不管这些球如何碰撞多少次,它们之间的相对顺序是不会变化的,所以对求出来的位置进行排个序就可以对上号了。
因此这个题的复杂度是O(N)。
另外这个题有两个恶心的地方:
(1)一个方向标记,还搞大小写两种,题目里好像根本没说明啊,害的我WA了好几次,看了别人的代码才知道。
(2)结果小数点2位之后的数是直接截断的,并不是四舍五入,因此不可以直接打印,要先处理再打印。

代码

Source CodeProblem: 2674       User: liangrx06
Memory: 8108K       Time: 579MS
Language: C++       Result: Accepted
Source Code
#include <iostream>
#include <cstdio>
using namespace std;const int N = 32000;int main(void)
{int n;double l, v;while (cin >> n && n) {cin >> l >> v;int pnum = 0;double pmaxt = -1, nmaxt = -1;char dir[2];double pos;char name[N][251];for (int i = 0; i < n; i ++) {scanf("%s%lf%s", dir, &pos, name[i]);if (dir[0] == 'p' || dir[0] == 'P') {pnum ++;if (pmaxt < 0)pmaxt = (l-pos)/v;}else {nmaxt = pos/v;}}if (pmaxt > nmaxt)printf("%13.2lf %s\n", (int)(pmaxt*100)/100.0, name[n-pnum]);elseprintf("%13.2lf %s\n", (int)(nmaxt*100)/100.0, name[n-pnum-1]);}return 0;
}

这篇关于《挑战程序设计竞赛》3.2.3 常用技巧-弹性碰撞 POJ3684 2674的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868684

相关文章

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

90%的人第一步就错了! 顺利登录wifi路由器后台的技巧

《90%的人第一步就错了!顺利登录wifi路由器后台的技巧》登录Wi-Fi路由器,其实就是进入它的后台管理页面,很多朋友不知道该怎么进入路由器后台设置,感兴趣的朋友可以花3分钟了解一下... 你是不是也遇到过这种情况:家里网速突然变慢、想改WiFi密码却不知道从哪进路由器、新装宽带后完全不知道怎么设置?别慌

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

录音功能在哪里? 电脑手机等设备打开录音功能的技巧

《录音功能在哪里?电脑手机等设备打开录音功能的技巧》很多时候我们需要使用录音功能,电脑和手机这些常用设备怎么使用录音功能呢?下面我们就来看看详细的教程... 我们在会议讨论、采访记录、课堂学习、灵感创作、法律取证、重要对话时,都可能有录音需求,便于留存关键信息。下面分享一下如何在电脑端和手机端上找到录音功能

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.