HDU 4445 几何枚举

给出两个坦克位置,N个炮弹,从(0,h)点以一定角度射出,问在某一角度下能够打到第一个坦克的炮弹最多个数,要求在该角度下所有炮弹都不会打到第二个坦克。

可以暴力水过,枚举角度判断即可

需要几个几何公式化简:

x=v*sinθ*t

v*cosθ*t+g*t*t/2=h

注意sin 和 cos 函数用多会超时

#include "stdio.h"
#include "string.h"
#include "math.h"

double pi=acos(-1.0);

int main()
{
    int n,j,sum,ok,sb,ans;
    double a,H,h,l1,r1,l2,r2,key,b,c,t,x,i,t1,t2,vx,vy;
    double v[210];

    while (scanf("%d",&n)!=EOF)
    {
        if (n==0) break;
        scanf("%lf%lf%lf%lf%lf",&H,&l1,&r1,&l2,&r2);
        for (j=1; j<=n; j++)
            scanf("%lf",&v[j]);

        if (l2<=l1 && r2>=r1)
        {
            printf("0\n");
            continue;
        }
        ans=0;
        sum=0;
        for (i=0; i<3.1415926; i+=0.0007)
        {

            sum=0;
            ok=1;
            for (j=1;j<=n;j++)
            {
                 a=4.9;

                 b=-v[j]*cos(i);
                 c=-H;
                 t=(-b+sqrt(b*b-4*a*c))/9.8;
                 x=sin(i)*v[j]*t;
                 if (x>=l2 && x<=r2 )
                 {
                     ok=0; break;
                 }
                 if (x>=l1 && x<=r1 )
                    sum++;
            }
            if (ok==1 && sum>=ans)
                ans=sum;
           // if (ans==n) break;
        }

        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-11-09 04:02:19

HDU 4445 几何枚举的相关文章

hdu 4445 Crazy Tank(枚举)

http://acm.hdu.edu.cn/showproblem.php?pid=4445 要求发射的炮弹在都不落在friendly tank区域的条件下落在enemy tank区域的最多数目. 直接暴力枚举角度.. #include <stdio.h> #include <iostream> #include <map> #include <set> #include <bitset> #include <list> #inclu

hdu 4445 Crazy Tank(物理过程枚举)

遇到物理题,千万不要一味的当成物理题去想着推出一个最终结果来,这样ACM竞赛成了物理比赛,出题人就没水平了...往往只需要基础的物理分析,然后还是用算法去解决问题.这题n小于等于200,一看就估计是暴力枚举能过.就枚举角度就行了. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include

[物理题+枚举] hdu 4445 Crazy Tank

题意: 给你N个炮弹的发射速度,以及炮台高度H和L1,R1,L2,R2. 问任选发射角度.最多能有几个炮弹在不打入L2~R2的情况下打入L1~R1 注意:区间有可能重叠. 思路: 物理题,发现单纯的依据V去求X很困难. 这个时候想到暴力枚举角度.for(double i=0; i<=pi; i+=0.0007) 算出能到达的x.然后推断x,统计sum 发现以增长级0.0007弧度 刚刚好能过这道题 反正也是醉了~ 代码: #include"cstdlib" #include&qu

hdu 4445 Crazy Tank (暴力枚举)

Crazy Tank Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4562    Accepted Submission(s): 902 Problem Description Crazy Tank was a famous game about ten years ago. Every child liked it. Time f

HDU 4445 Crazy Tank --枚举

题意: n个物体从高H处以相同角度抛下,有各自的初速度,下面[L1,R1]是敌方坦克的范围,[L2,R2]是友方坦克,问从某个角度抛出,在没有一个炮弹碰到友方坦克的情况下,最多的碰到敌方坦克的炮弹数. 解法: 枚举角度,将pi/2分成1000份,然后枚举,通过方程 v*sin(theta)*t - 1/2*g*t^2 = -H 解出t,然后 x = v*cos(theta)*t算出水平距离,直接统计即可. 代码: #include <iostream> #include <cstdio&

HDU 6103 Kirinriki 枚举长度 尺取法

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6103 题目描述: 定义两个相同长度的字符串的值为首尾开始字符串的ASCII相减, 求一个字符串中任取两个相同长度的不重叠的值不超过m的最大长度 解题思路: 求连续区间不超过某一个上限或者不低于某个下限的应该用尺取法 ,复杂度为O(n),  本题n是5000所以O(n^2)可行, 枚举前缀和后缀(通过枚举前缀, 再将字符串翻转枚举前缀进行), 再进行尺取 代码:  代码中有注释 #include <

HDU 5365-Run(几何)

题目地址:HDU 5365 题意: 问题描述 小花是一个热爱健身的姑娘,这天她下载了一个跑步软件,这个软件可以记录下小花跑步的轨迹.小花决定去公园跑步.公园里有许许多多的座椅,小花希望在一些座椅休息一下,并且她在两条座椅之间只跑直线.小花是一个完美主义者,她希望自己最后的轨迹是一个正三边形或者正四边形或者正五边形或者正六边形.小花会从某条座椅开始打开跑步软件,并在回到这个座椅后关闭. 请问小花有多少种跑法.注:若两种跑法经过的座椅集合相同则认为是一种跑法.且经过一条座椅时没有必要一定停下来 输入

HDU 4445 数学-抛物运动

                                                      D - Crazy Tank                                                 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Crazy Tank was a famous game about ten years

hdu 4445 37届金华赛区 D题

题意:给一个坦克的高度,求炮弹能打中最多的数量 枚举角度,作为一名学霸虽然很快推出了公式,但是却没有考虑到,角度可以朝下的情况 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespa