《挑战程序设计竞赛》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

相关文章

C#中的 Dictionary常用操作

《C#中的Dictionary常用操作》C#中的DictionaryTKey,TValue是用于存储键值对集合的泛型类,允许通过键快速检索值,并且具有唯一键、动态大小和无序集合的特性,常用操作包括添... 目录基本概念Dictionary的基本结构Dictionary的主要特性Dictionary的常用操作

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

Apache伪静态(Rewrite).htaccess文件详解与配置技巧

《Apache伪静态(Rewrite).htaccess文件详解与配置技巧》Apache伪静态(Rewrite).htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令,主要的... 一、.htAccess的基本作用.htaccess是一个纯文本文件,它里面存放着Apache服务器

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

Python中常用的四种取整方式分享

《Python中常用的四种取整方式分享》在数据处理和数值计算中,取整操作是非常常见的需求,Python提供了多种取整方式,本文为大家整理了四种常用的方法,希望对大家有所帮助... 目录引言向零取整(Truncate)向下取整(Floor)向上取整(Ceil)四舍五入(Round)四种取整方式的对比综合示例应

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

Python中操作Redis的常用方法小结

《Python中操作Redis的常用方法小结》这篇文章主要为大家详细介绍了Python中操作Redis的常用方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解一下... 目录安装Redis开启、关闭Redisredis数据结构redis-cli操作安装redis-py数据库连接和释放增