poj 1852&3684 题解

poj 1852 3684

这两题思路相似就放在一起.

1852

题意

一块长为L长度单位的板子(从0开始)上有很多只蚂蚁,给出它们的位置,它们的方向不确定,速度为每秒一长度单位,当两只蚂蚁相遇的时候,它们会反向而行,问所有蚂蚁到达终点(到0或者到L)所需要的最短时间和最长时间。

解析

一开始拿到这题觉得还是有点难度的,但一想通就发现这是个大水题。我们可以假设两只蚂蚁它们相向而行,并且它们中间没有别的蚂蚁,此时它们距离为k,经过时间t后它们相遇,此时它们反向,又经过时间t它们再次之间距离还是k。但如果我们假设它们相遇不反向,那么它们的情况也是一样的。所以这些所谓的反向都是在迷惑你,事实上根本不需要反向这种操作,所以这题就变得非常水了。

代码

#include<cstdio>
#include<algorithm>
using namespace std;
int T,n,s,k;
int main(){
    scanf("%d",&T);
    while(T--){
        int minn=0;
        int maxn=0;
        scanf("%d %d",&s,&n);
        for(int i=1;i<=n;++i){
            scanf("%d",&k);
            minn=max(minn,min(k,s-k));
            maxn=max(maxn,max(k,s-k));
        }
        printf("%d %d\n",minn,maxn);
    }
    return 0;
}

3684

题意

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

解析

跟前面的题目相同,由于质量相同,碰撞又没有能量损失,由动量守恒可知它们只是速度反向,所有的球都一样可以忽视它们的碰撞,视为互相穿过继续运动。这样就可以分别单独求出每个球T时刻的高度后排序就是答案了。

代码

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const double g=10.0;
int N,H,R,T,C;
double y[110];
double cal(double T){
    if(T<0) return H;
    double t=sqrt(2*(double)H/g);
    int k=T/t;
    if(k&1){
        double d=k*t+t-T;
        return H-(d*d*g/2.0);
    }else{
        double d=T-k*t;
        return H-(d*d*g/2.0);
    }
}
int main(){
    scanf("%d",&C);
    while(C--){
        scanf("%d %d %d %d",&N,&H,&R,&T);
        for(int i=0;i<N;++i){
            y[i]=cal((double)T-i);
        }
        sort(y,y+N);
        for(int i=0;i<N;++i){
            printf("%.2f%c",y[i]+2*R*i/100.0,i+1==N ? '\n':' ');
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/donkey2603089141/p/11680020.html

时间: 2024-10-07 03:14:47

poj 1852&3684 题解的相关文章

POJ 1159 Palindrome 题解

本题的题意理解之后,就是求最长回文子序列 longest palindrome subsequence,这里注意子序列和子串的区别. 有两种求法,一种是直接求,相当于填矩阵右上对角阵,另一种是转化为longest common subsequence的求法. 最大难点就是要求内存不能使用二维的. 故此第一种方法是有点难度的,因为需要把二维矩阵的对角线转化为一维表记录,对好下标就好了. 第二中方法会稍微容易点,效率都是一样的O(n*n). 方法1: #include <cstdio> const

POJ - Counterfeit Dollar 题解

挺考智力的题目. 思路: 1 如果是假币,那么每次都必定引起天平的不平衡 2 如果天平平横,那么全部都肯定是真币 利用这个特性,利用hash表,就能写出很简洁的程序. 如果使用枚举,那么会(轻松?)过百行的代码的. 当然其实题目给出了条件:一定可以找出唯一的假币的. 如果没有这个条件,那么是不一定可以三次称,就能确定结果的. 下面程序参考了别人的: http://www.cnblogs.com/orangeman/archive/2009/07/10/1520663.html 这个家伙的思路也不

UVa 127 - &quot;Accordian&quot; Patience POJ 1214 链表题解

UVa和POJ都有这道题. 不同的是UVa要求区分单复数,而POJ不要求. 使用STL做会比较简单,这里纯粹使用指针做了,非常麻烦的指针操作,一不小心就错.调试起来还是非常费力的 本题理解起来也是挺费力的,要搞清楚如何模拟也不容易啊,读题要很仔细. 纯指针的操作挺快的吧.不过POJ 0ms,而UVa就0.2左右了. 三相链表: 1 只要有叠起来的牌,那么就使用一个down指针指向下面的牌就可以了. 2 使用双向链表,可以方便前后遍历. 3 记得有了更新牌之后,又要重新开始检查是否需要更新牌,这是

bzoj 2419 &amp; poj 3532 电阻 题解

[原题] 2419: 电阻 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 131  Solved: 51 Description 你突破了无数艰难险阻,终于解决了上面那道题,众神犇瞬间就 震惊了.他们发现居然有人可以把那种非人类做的题目做出来. 他们一致同意,最后这道题不能再出数学题了.考虑到两位小盆 友的状态,他们决定考考你的初中物理水平. 一个电路板,有 N 个接点,M 个电阻.电阻两端都在接点上, 都告诉了你阻值.询问1 号点与N 号点的

POJ 1026 Cipher 题解

看似简单的字符串处理,不过直接暴力法是会超时的. 故此需要优化,这里使用周期优化. 研究过数列序列的都知道,其实序列反复调用另外一个序列得到一个新的序列,都会出现周期的,问题是周期何时出现,如果利用这个周期. 这就需要分开每个数,使用一个新的数列记录每个数的周期,利用这个周期截去一大段数据,那么剩下的数据就很好处理了. 因为所有的周期数总和都不会超过n,数列的长度的,所以时间效率可以达到O(n),常数项为2. 其他难度,我觉得相对新手来说,就是执行的细节最困难了,比如下标的准确性,如何移动数据等

POJ 2411【题解】Mondriaan&#39;s Dream 状压DP

题目链接:http://poj.org/problem?id=2411 把每一行当作一个二进制状态. 1表示是一个竖着的1*2的方格. 0表示其他状态. 那么显然当i-1的状态k能转移到i的j: 1.j 和 k 的按位与为0.(有1必须要0,0也可以有1) 2.j 和 k 按位或每一段0都有偶数个.(表示横着的长方形) 那么就可以预处理一下合格的点. 然后状压DP. 代码如下: #include<cstdio> using namespace std; int n,m; long long f

POJ 3279(Fliptile)题解

以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑色所需翻转的是哪些棋子(这句话好长...). [题目分析] 盯着奇怪的题目看了半天发现和奶牛没什么卵关系..奶牛智商高了产奶高是什么鬼说法... 这题刚开始被放到搜索的分类下了..然而这和搜索有什么关系..没经验所以想了各种和搜索沾边的方法,结果没想出解法,直到看了网上的题解,压根不是搜索啊有木有.

POJ 1862 Stripies 题解 《挑战程序设计竞赛》

题目:POJ - 1862 思路:每次挑选最大的两个数,进行2*sqrt(a,b)运算后放入到队列中.有点类似于之前做的fence repair题目. 这样可以保证大数被开方的次数更多,最后的结果更小. 注意: n为1的情况,WA了几次. 学会C++输出格式控制: http://c.biancheng.net/cpp/biancheng/view/2227.html. 1 #include <iostream> 2 #include <stdio.h> 3 #include <

POJ 1190 生日蛋糕题解

题目地址:http://poj.org/problem?id=1190 一道很有趣的搜索题--主要是剪枝-- 我弄了5个剪枝: 1.当前剩余层数>=上层半径,剪掉 2.当前剩余层数>=上层高度,剪掉 3.体积<1,剪掉 4.体积<当前可能的最小体积(我用等差数列求和公式算的--也不知道对不对) 5.神奇剪枝网上看的,当前(剩余体积*2)/上层半径+当前表面积总和>当前搜出的最优解,剪掉 代码很简单,20行 1 #include <iostream> 2 #incl