zoukankan      html  css  js  c++  java
  • POJ 3977 Subset | 折半搜索

    题目:

    给出一个整数集合,求出非空子集中元素和绝对值最小是多少(元素个数尽量少)


    题解:

    分成两半

    爆搜每一半,用map维护前一半的值

    每搜出后一半的一个值就去map里找和他和绝对值最小的更新答案

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<map>
    typedef long long ll;
    using namespace std;
    ll n,a[50],ans,tmp,ok;
    map <ll,ll> mp;
    map <ll,ll> :: iterator it;
    ll Abs(ll x){ return x>0?x:-x;}
    void DfsFront(ll step,ll state,ll val)
    {
        if (step>n/2)
        {
    	it=mp.find(val);
    	if (it!=mp.end())
    	    mp[val]=min(mp[val],state);
    	else
    	    mp[val]=state;
    	if (Abs(val)<ans && state!=0)
    	    ans=Abs(val),tmp=state;
    	if (Abs(val)==ans && state<tmp && state!=0)
    	    tmp=state;
    	return ;
        }
        DfsFront(step+1,state,val);
        DfsFront(step+1,state+1,val+a[step]);
    }
    void DfsBack(ll step,ll state,ll val)
    {
        if (step>n)
        {
    	it=mp.lower_bound(-val);
    	ll w=it->first;
    	if (it!=mp.end() && Abs(val+w)<ans && it->second+state!=0)
    	    ans=Abs(val+w),tmp=it->second+state;
    	if (it!=mp.end() && Abs(val+w)==ans && mp[w]+state<tmp && mp[w]+state!=0)
    	    tmp=mp[w]+state;
    	if (it!=mp.begin()) it--;
    	if (it!=mp.end())
    	{
    	    w=it->first;
    	    if (Abs(val+w)<ans && state+it->second!=0)
    		ans=Abs(val+w),tmp=it->second+state;
    	    if (Abs(val+w)==ans && it->second+state<tmp && it->second!=0)
    		tmp=it->second+state;
    	}
    	return ;
        }
        DfsBack(step+1,state,val);
        DfsBack(step+1,state+1,val+a[step]);
    }
    int main()
    {
        while (scanf("%lld",&n)!=0,n)
        {
    	mp.clear();
    	ans=mp[0]=0;
    	for (int i=1;i<=n;i++)
    	    scanf("%lld",&a[i]),ans+=233+Abs(a[i]);
    	DfsFront(1,0,0);
    	DfsBack(n/2+1,0,0);
    	printf("%lld %lld
    ",ans,tmp);
        }
        return 0;
    }
    
  • 相关阅读:
    总结:工作 + 学习 (2019年)
    JVM 理解性学习(一)
    渗透神器cobalt strike在数字杀软环境下的使用
    普通路由器刷开源固件DD-WRT的简单过程
    云烟渗透题总结
    对thinkphp5.0框架的实例学习
    内网渗透 关于GPO
    简单尝试利用维控LeviStudioU的一栈缓冲区溢出漏洞
    试写foxit reader的ConvertToPDF功能的wrapper
    第05章下 加载内核
  • 原文地址:https://www.cnblogs.com/mrsheep/p/8043439.html
Copyright © 2011-2022 走看看