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

相关文章

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.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.