zoukankan      html  css  js  c++  java
  • FZU 2144 Shooting Game(数学+贪心)

      主要思路:求出蚊子到达球的时间区间(用方程得解),对区间做一个贪心的选择,选择尽可能多的区间有交集的区间段(结构体排序即可),然后计数.

    #include <cstdio>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define ll long long
    #define maxn 100025
    int n, m, x,y;
    ll r;
    int t;
    struct point
    {
        ll x, y, z,dx,dy,dz;
        point(ll x = 0, ll y = 0, ll z = 0, ll dx = 0, ll dy = 0, ll dz = 0) :x(x), y(y), z(z) {}
    } a[maxn];
    ll dis(point p1,point p2)
    {
        return (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y) + (p1.z - p2.z)*(p1.z - p2.z);
    }
    int b[maxn];
    double c[maxn];
    struct node
    {
        double lf, ri;
    } lr[maxn];
    bool cmp(node a, node b)
    {
        return a.lf < b.lf;
    }
    int main()
    {
        int cas = 1;
        scanf("%d", &t);
        while (t--)
        {
            scanf("%d%ld", &n, &r);
            int k = 0;
            point a;
            for (int i = 0; i < n; i++)
            {
                scanf("%I64d%I64d%I64d%I64d%I64d%I64d", &a.x, &a.y, &a.z, &a.dx, &a.dy, &a.dz);
                ll bb = 2 * (a.x*a.dx + a.y*a.dy + a.z*a.dz);
                ll aa = a.dx*a.dx + a.dy*a.dy + a.dz*a.dz;
                ll cc = a.x*a.x + a.y*a.y + a.z*a.z - r*r;
                if (bb*bb - 4 * aa*cc >= 0)
                {
                    if (dis(a, point(0, 0, 0))>r*r&&a.x*a.dx + a.y*a.dy +a.z*a.dz >= 0)continue;
                    double m1 = max(0.0, (-bb - sqrt((double)bb*bb - 4 * (double)aa*cc)) / 2 / aa);
                    double m2 = max(0.0, (-bb + sqrt((double)bb*bb - 4 * (double)aa*cc)) / 2 / aa);
                    lr[k].lf = min(m1, m2), lr[k++].ri = max(m1, m2);
                }
            }
            sort(lr, lr + k,cmp);
            c[k - 1] = lr[k-1].ri;
            for (int i = k - 2; i >= 0; i--)c[i] = min(c[i + 1], lr[i].ri);
            printf("Case %d: ", cas++);
            double temp;
            m = 0;
            for (int i = 0; i < k;)
            {
                temp = c[i];
                m++;
                while (i<k&&lr[i].lf <= temp)i++;
            }
            printf("%d %d
    ", k, m);
        }
    }
  • 相关阅读:
    C语言I博客作业03
    C语言I—2019秋作业02
    C语言I博客作业04
    C语言I博客作业02
    C语言I博客作业02
    C语言I博客作业04
    C语言I博客作业02
    C语言I博客作业02
    第一周作业
    C语言I博客作业04
  • 原文地址:https://www.cnblogs.com/jifahu/p/5448816.html
Copyright © 2011-2022 走看看