码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5323(2015多校3)-Solve this interesting problem(dfs+剪枝)

时间:2015-07-30 11:29:28      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:dfs   节点   剪枝   

题目地址:HDU 5323
题意:给一个l,r,表示区间[l,r],问是否存在区间为[0,n]的线段树的节点区间为[l,r],如果有求最小的n,如果没有输出-1。
思路:因为L/(R-L+1)<=2015,按照线段树的性质每次分区间序号扩大两倍,所以可以得出差不多有22层,所以用爆搜就可以,由上把[l,r]区间不断扩张,直到满足l==0为止。顺便剪剪枝。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-8;
int ans;
int dfs(int l,int r)
{
    if(l<0) return ans;//控制左边界
    if(!l){//保存当前最小的右边界
        ans=min(ans,r);
        return ans;
    }
    if(2*l<r+1) return ans;//剪枝。相当于控制右边界
    if(l==r) {//左边界等于右边界的时候不用处理,直接输出、
        return r;
    }
    //下面是四种情况。
    dfs(l,2*r-l+1);
    dfs(l,2*r-l);
    dfs(2*l-r-1,r);
    dfs(2*l-r-2,r);
}
int main()
{
    int l,r;
    while(~scanf("%d %d",&l,&r)){
        ans=inf;
        ans=dfs(l,r);
        if(ans==inf)
            puts("-1");
        else
            printf("%d\n",ans);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 5323(2015多校3)-Solve this interesting problem(dfs+剪枝)

标签:dfs   节点   剪枝   

原文地址:http://blog.csdn.net/u013486414/article/details/47145123

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!