hdu 4932 /bestcoder B题 #4 /思维题

题意:给一个数列(整数),用一些不相交的区间去覆盖(只能是用端点去覆盖,端点可以交)。而且区间出度相等。求最大区间长度。

开始一下就敲了,枚举每个区间长度,判断合法,更新最大。但是后来一看小数,感觉不行,改为二分,后来还是挂了。。。

赛后才知道,二分的时候,答案必需要满足单调性啊,这里小的数据不行,大的数据可以行!如 0 1 5 6 10, 3不行,4行。

后来才知道,枚举时,每个差值的一半也是可以的:仔细想想很容易证明。(水,坑)

#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
vector<int>v; int n;
bool ok(double tmax)
{
    int fl=-1;
    for(int j=1;j<n-1;j++)
    {
        if(fl==-1)          //之前的放在前
        {
          if(v[j]-tmax<v[j-1])  //放前面不行,放后面:
            {
             if(v[j]+tmax<=v[j+1])  //放后面
                {
                   fl=1;
                   if(v[j]+tmax==v[j+1])    //下一个免了
                    {
                        j++;
                        fl=-1;
                    }
                 }
             else         //否则不行
                 return 0;
            }
            else    //放前面
                 fl=-1;
        }
         else          //之前的在后面,
            {
                if(v[j]-tmax<v[j-1]+tmax) //放前面放不来
                  {
                     if(v[j]+tmax<=v[j+1])
                       {
                          fl=1;
                         if(v[j]+tmax==v[j+1])
                             {
                                 j++;
                                 fl=-1;
                             }
                        }
                     else
                     {
                         return 0;
                     }
                  }
                  else
                  {
                      fl=-1;
                  }
            }
    }

    return 1;
}
vector<double>dis;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n;
        int tx=0;
        v.clear();
        dis.clear();
        for(int i=0;i<n;i++)
          {
              cin>>tx;
            v.push_back(tx);
          }
         sort(v.begin(),v.end());
          for(int i=0;i<n-1;i++)
          {
             double d=v[i+1]-v[i];
             dis.push_back(d);
             dis.push_back(d/2.0);
          }
       sort(dis.begin(),dis.end());
       for(int i=dis.size()-1;i>=0;i--)
        {
           if(ok(dis[i]))
           {
             printf("%.3lf\n",dis[i]);
             break;
           }
       }

    }
    return 0;
}

hdu 4932 /bestcoder B题 #4 /思维题

时间: 2024-11-09 04:03:53

hdu 4932 /bestcoder B题 #4 /思维题的相关文章

BZOJ 3097: Hash Killer I【构造题,思维题】

3097: Hash Killer I Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 963  Solved: 364[Submit][Status][Discuss] Description 这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题: 给你一个长度为N的字符串S,求有多少个不同的长度为L的子串. 子串的定义是S[l].S[l + 1].... S[r]这样连续的一段. 两个字符串被认为是

HDU 5122 K.Bro Sorting(模拟——思维题详解)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5122 Problem Description Matt's friend K.Bro is an ACMer. Yesterday, K.Bro learnt an algorithm: Bubble sort. Bubble sort will compare each pair of adjacent items and swap them if they are in the wrong o

HDU 6205 2017沈阳网络赛 思维题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6205 题意:给你n堆牌,原本每一堆的所有牌(a[i]张)默认向下,每次从第一堆开始,将固定个数的牌(b[i]张)翻上,然后下一堆继续,直到没有足够的牌翻上,然后你可以获得当前已经操作过的堆的所有牌.最初你可以调整堆的顺序,把第一堆放到最后一堆(逆时针旋转),你可以重复这个操作,问你要重复多少次这个操作,才能获得最多的牌. 解法:先把这个序列复制一遍放在原来的序列后面.当i=n的时候结束就可以了,每次

2016女生赛 HDU 5710 Digit-Sum(数学,思维题)

Digit-Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 782    Accepted Submission(s): 241 Problem Description Let S(N) be digit-sum of N , i.e S(109)=10,S(6)=6 . If two positive integers a,b

BestCoder Round #4 前两题 hdu 4931 4932

第一题太水了.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int a[6]; 7 int main(){ 8 int cas; 9 scanf( "%d", &cas ); 10 while( cas-- ){ 11 for( int i = 0; i <

hdu 4883 思维题

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4883 TIANKENG’s restaurant Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 566    Accepted Submission(s): 267 Problem Description TIANKENG manages a

HDU 4908 (杭电 BC #3 1002题)BestCoder Sequence(DP)

题目地址:HDU 4908 这个题是从m开始,分别往前DP和往后DP,如果比m大,就比前面+1,反之-1.这样的话,为0的点就可以与m这个数匹配成一个子串,然后左边和右边的相反数的也可以互相匹配成一个子串,然后互相的乘积最后再加上就行了.因为加入最终两边的互相匹配了,那就说明左右两边一定是偶数个,加上m就一定是奇数个,这奇数个的问题就不用担心了. 代码如下: #include <iostream> #include <stdio.h> #include <string.h&g

hdu 4972 A simple dynamic programming problem (转化 乱搞 思维题) 2014多校10

题目链接 题意:给定一个数组记录两队之间分差,只记分差,不记谁高谁低,问最终有多少种比分的可能性 分析: 类似cf的题目,比赛的时候都没想出来,简直笨到极点..... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <vector> 7 #include &

Valentine&#39;s Day Round hdu 5176 The Experience of Love [好题 带权并查集 unsigned long long]

传送门 The Experience of Love Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 221    Accepted Submission(s): 91 Problem Description A girl named Gorwin and a boy named Vivin is a couple. They arriv