hdu 4932 Miaomiao's Geometry 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4932

题目意思:给出 n 个点你,需要找出最长的线段来覆盖所有的点。这个最长线段需要满足两个条件:(1)每个点是某条线段的左端点或右端点   (2)任意两条线段之间的重叠部分的长度为0。(一个点重叠默认长度为0,即[1,2] , [2, 3] 视为合法)。还有一点我来补充吧,就是这个最大长度是固定的,看第3组测试数据  1 9 100 10,[-7,1] , [1,9] , [10,18] , [100,108]   长度都为8,不能参差不齐啦~~~~

昨天的BestCoder 4 的 B 题,好多人过pretest,但最终能过final ,寥寥无几啊(当中这行列有我啦),希望过后的失望啊.......天真的做法:每个点求出它两边的间隙,保存较大的那个(因为正常情况下都应该向大的那边扩展啦),然后在所有点的较大的那个中找出最小的那个就是答案了......

const int maxn = 100 + 10;
int maxx[maxn], minn[maxn];
int a[maxn];

int main()
{
    int T, n;
    while (scanf("%d", &T) != EOF)
    {
        while (T--)
        {
            scanf("%d", &n);
            for (int i = 0; i < n; i++)
                scanf("%d", &a[i]);
            sort(a, a+n);
            int ll = abs(a[0]-1e9);
            maxx[0] = max(a[1]-a[0], ll);
            for (int i = 1; i < n-1; i++)
                 maxx[i] = max(a[i]-a[i-1], a[i+1]-a[i]);
            int rr = abs(1e9-a[n-1]);
            maxx[n-1] = max(a[n-1]-a[n-2], rr);
            double ans = 1e9;
            for (int i = 0; i < n; i++)
                ans = min((double)maxx[i], ans);
            printf("%.3f\n", ans);
        }
    }
    return 0;
}

貌似挺多人好像我这样做滴= =。

给组测试数据立马知道出事了!!!!

6

-1     0    10     12    18    20

答案:   3

错误答案:6

如果忽略每两个点之间的间隙/2 而不去逐个测试,也就是只测试 每两个点之间的间隙,那么就  呵呵  了,会得出 2 这个答案,也是错滴!!! 可以这样想,对于相邻的两个点,它们可以面向对方扩展的嘛,也不一定都要背对着扩展的。

还有一个坑爹的地方,误差!!!一开始对于输出 a real number 就觉得好似是多余的,原来暗示着要测试误差呢。

总的来说,BestCoder 的题目:潜水淹死人!!!

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <cmath>
 7 #include <vector>
 8 using namespace std;
 9
10 #define eps 1e-9
11 #define pb push_back
12 const int maxn = 50 + 5;
13 vector<double> vd;
14 double a[maxn];
15 int n;
16
17 bool check(double gap)
18 {
19     double pre = a[0];
20     for (int i = 1; i < n; i++)
21     {
22         if (fabs(a[i]-pre) < eps)  // 没这句会wa
23             continue;
24         if (pre > a[i])
25             return false;
26         else if (pre + gap <= a[i])
27             pre = a[i];
28         else
29             pre = a[i] + gap; // 这一句意味深长啊,如果它更新后比下一个待检测的a[i]大,即:    if (pre > a[i])  就没有继续比较下去的必要
30     }
31     return true;
32 }
33
34 int main()
35 {
36     int T;
37     while (scanf("%d", &T) != EOF)
38     {
39         while (T--)
40         {
41             scanf("%d", &n);
42             for (int i = 0; i < n; i++)
43                 scanf("%lf", &a[i]);
44             sort(a, a+n);
45             for (int i = 1; i < n; i++)
46             {
47                 vd.pb(a[i]-a[i-1]);
48                 vd.pb((a[i]-a[i-1])/2);  // 别遗漏
49             }
50             double ans = 0;
51             for (int i = vd.size(); i >= 0; i--)
52             {
53                 if (check(vd[i]))
54                     ans = max(ans, vd[i]);
55             }
56             printf("%.3f\n", ans);
57         }
58     }
59     return 0;
60 }

姑且归去数学专区吧= =

hdu 4932 Miaomiao's Geometry 解题报告,布布扣,bubuko.com

hdu 4932 Miaomiao's Geometry 解题报告

时间: 2024-10-15 03:43:46

hdu 4932 Miaomiao's Geometry 解题报告的相关文章

hdu 4932 Miaomiao&#39;s Geometry(暴力)

题目链接:hdu 4932 Miaomiao's Geometry 题目大意:在x坐标上又若干个点,现在要用若干条相等长度的线段覆盖这些点,若一个点被一条线段覆盖,则必须在这条线的左端点或者是右端点,并且各个线段放的位置不能又重叠,求最大长度. 解题思路:这题有坑点,比赛的时候o(n)的算法去寻找两点之间最短距离.但起始这样是不行的,比如-1 0 10 12 18 20,这样维护过去的话,最短应该是12~18,长度为6,这段线段可以覆盖12和18的点,然后-1和20又在两端.于是只有0和10两点

[BestCoder Round #4] hdu 4932 Miaomiao&#39;s Geometry (贪心)

Miaomiao's Geometry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 363    Accepted Submission(s): 92 Problem Description There are N point on X-axis . Miaomiao would like to cover them ALL by

HDU 4932 Miaomiao&#39;s Geometry(推理)

HDU 4932 Miaomiao's Geometry 题目链接 题意:给定x轴上一些点(不重复),现在要选一个线段,使得能放进这些区间中,保证线段不跨过点(即线段上只能是最左边或最右边是点),并且没有线段相交,求能放进去的最大线段 思路:推理一下,只有两点之间的线段,还有线段的一半可能符合题意,然后对于每种线段,去判断一下能不能成功放进去,这步用贪心,优先放左边,不行再放右边 代码: #include <cstdio> #include <cstring> #include &

HDU 4932 Miaomiao&#39;s Geometry(BestCoder Round #4)

Problem Description: There are N point on X-axis . Miaomiao would like to cover them ALL by using segments with same length. There are 2 limits: 1.A point is convered if there is a segments T , the point is the left end or the right end of T.2.The le

hdu 4932 Miaomiao&#39;s Geometry 暴力枚举

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4932 Miaomiao's Geometry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 694    Accepted Submission(s): 180 Problem Description There are N point

hdu 4932 Miaomiao&#39;s Geometry(暴力枚举)

Miaomiao's Geometry                                                                              Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description There are N point on X-axis . Miaomiao would like

HDU 4932 Miaomiao&#39;s Geometry

答案只可能有两种情况 要么是已知点的距离 要么是已知点距离的一半 那么就枚举每个点之间的距离 和距离的一半 先把所有点按照升序排序 然后用枚举的值贪心 对于点A[i] 如果能放[[A[i]-now,A[i]]就放 否则就放[A[i],A[i]+now] #include<bits/stdc++.h> using namespace std; double a[120],b[120]; int main() { int T,N; scanf("%d",&T); for

hdu 4932 Miaomiao&amp;#39;s Geometry(暴力枚举)

Miaomiao's Geometry                                                                              Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description There are N point on X-axis . Miaomiao would like

hdu 1166 敌兵布阵 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目意思:给出 N 个数你,通过对某些数进行更改(或者 + 或者 -),当输入的是 Query 的时候,需要计算出 某个区间的和. 树状数组第一题,算是模板吧 ^_^ 有个小细节,wa 了几次,细心~细心~~~细心 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <