POJ 3977 鎶樺崐鏋氫妇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3977 鎶樺崐鏋氫妇相关的知识,希望对你有一定的参考价值。

鏍囩锛?a href='http://www.mamicode.com/so/1/pojo' title='pojo'>pojo   zhang   class   for   cal   ref   fine   鎯呭喌   oid   

棰樼洰閾炬帴:http://poj.org/problem?id=3977

鍓嶈█

濡傛棤娉曞尯鍒嗘姌鍗婃灇涓撅紝浜屽垎锛?a href="https://blog.csdn.net/csyifanZhang/article/details/104724980">璇风偣鍑昏繖閲?/a>

鍒嗘瀽

杩欓鎴戞劅瑙夊嚭浜嗘槸鐢ㄦ灇涓撅紝姣曠珶鏁版嵁鑼冨洿寰堝皬锛屼絾鏄紝闆嗗悎涓瘡涓厓绱犻兘鏈夊彲鑳借閫夋垨鑰呬笉琚€夛紝鏍规嵁璁℃暟鍘熺悊搴旇浼氭湁(2^{35}-1)绉嶆儏鍐碉紝闇€瑕佸埁闄ょ┖闆嗭紝鏋氫妇鏄剧劧鏄細T鎺夛紝閭f€庝箞鍔炲憿锛?br> 鑰冭檻閫夊嚭鏉ョ殑闆嗗悎鏈夊嚑绉嶆儏鍐碉紝鏈夊彲鑳介兘鍦ㄥ墠涓€鍗婏紝鏈夊彲鑳介兘鍦ㄥ悗涓€鍗婏紝杩樻湁鍙兘鍓嶅悗閮芥湁锛屽墠鍚庨兘鏈夌殑鎯呭喌鍙互鎷嗗垎鎴愬墠涓ょ鎯呭喌锛?鎵€浠ヤ紭鍏堣€冭檻鍓嶄袱绉嶏紝35鐨勪竴鍗婂彲浠ュ彇17锛屽彂鐜?span class="math inline">(2^{17})鏄笉浼歍鐨勶紝鎴戜滑鍙姣忔鏋氫妇涓€鍗婏紝鐒跺悗灏辫兘瑙e喅杩欎釜闂锛岃繖灏辨槸濡傞鎵€璇寸殑鎶樺崐鏋氫妇銆?br> 浣跨敤涓婅堪鏂规硶鍙互瑙e喅鍓嶄袱绉嶆儏鍐碉紝閭e墠鍚庨兘鏈夊憿锛熷墠鍚庨兘鏈夌殑蹇呯劧鏄敱鍓嶄竴鍗婄殑涓€涓瓙闆嗗拰鍚庝竴鍗婄殑涓€涓瓙闆嗘瀯鎴愶紝鍥犱负瑕佺粷瀵瑰€兼渶灏忥紝鎵€浠ヨ浣胯繖涓泦鍚堟帴杩戜簬0锛屽洜姝ゆ灇涓惧墠涓€涓泦鍚堢殑姣忎釜瀛愰泦锛岀劧鍚庢壘鍒颁竴涓瓙闆嗙殑鍜屼笌杩欎釜瀛愰泦鐨勭浉鍙嶆暟鏈€鎺ヨ繎鐨勯泦鍚堬紝鎶婁粬浠綋浣滅瓟妗堝氨琛屻€?br> 杩欓亾棰樻潵璇寸殑璇濓紝鎰熻濡傛灉涓嶇煡閬撴姌鍗婃灇涓捐繖绉嶆€濇兂锛屽仛璧锋潵杩樻槸鎸哄洶闅剧殑 锛屾湁鐨勬椂鍊欐毚鍔涘苟涓嶆槸娌′粈涔堢敤锛?s>姣曠珶浜哄鐨勫彟涓€涓悕瀛楀彨鏈寸礌绠楁硶锛屼篃璁告湁鐨勬椂鍊欐兂涓嶅嚭浠€涔堥珮绔暟鎹粨鏋勶紝浠€涔堣浆绉绘柟绋嬶紝涓嶅鍐欎釜鏆村姏鐪嬬湅锛屼篃璁镐紭鍖栦竴涓嬪氨鑳紸锛屽氨绠桝涓嶄簡涔熶細鏈夊緢澶氳繃绋嬪垎鍚э紝姣曠珶OI涓嶅儚ACM閭f牱鍙畻AC鐨勯鐩紝涔熻10鍒嗗氨鑳芥媺寮€寰堝ぇ宸窛銆?/p>

#include<cstdio> 
#include<cstring> 
#include<algorithm> 
#include<map> 
#define ll long long 
const int N=40; 
using namespace std; 
ll a[N],n; 
pair<ll,ll> ans; 
map<ll,ll> p; 
map<ll,ll>::iterator it; 
ll abs(ll x){ 
    return x>0?x:-x; 
} 
void calc(){ 
    for(ll i=1;i<(1<<n/2);i++){ 
        ll t=i,sum=0,len=0; 
        for(ll j=n/2-1;j>=0;j--) 
            if(t&(1<<j))sum+=a[j],len++; 
        ll tep=abs(sum); 
        if(tep<ans.first || (tep==ans.first&&len<ans.second)) ans=make_pair(tep,len); 
        if(p[sum]>0)p[sum]=min(p[sum],len); 
        else p[sum]=len; 
    } 
    for(ll i=1;i<(1<<(n-n/2));i++){ 
        ll t=i,sum=0,len=0; 
        for(ll j=n-1;j>=n/2;j--){ 
            ll v=j-n/2; 
            if(t&(1<<v))sum+=a[j],len++; 
        } 
        ll tep=abs(sum); 
        if(tep<ans.first||(tep==ans.first&&len<ans.second)) 
            ans=make_pair(tep,len); 
        it=p.lower_bound(-sum); 
        if(it!=p.end()){ 
            ll val=abs((*it).first+sum),l=(*it).second+len;     
            if(ans.first>val||(ans.first==val&&l<ans.second)) 
            ans=make_pair(val,l); 
        } 
        if(it!=p.begin()){ 
            it--; 
            ll val=abs((*it).first+sum),l=(*it).second+len; 
            if(ans.first>val||(ans.first==val&&l<ans.second)) ans=make_pair(val,l);
        } 
    } 
    printf("%lld %lld
",ans.first,ans.second); 
} 
int main(){ 
    while(~scanf("%lld",&n)){ 
        if(n==0)return 0; 
        p.clear(); 
        for(int i=0;i<n;i++) 
            scanf("%lld",&a[i]); 
        ans=make_pair(abs(a[0]),1); 
        calc(); 
    } 
}

以上是关于POJ 3977 鎶樺崐鏋氫妇的主要内容,如果未能解决你的问题,请参考以下文章

Android浣跨敤娉ㄨВ浠f浛鏋氫妇浠庤€岃妭鐪佺郴缁熶娇鐢ㄧ殑鍐呭瓨寮€閿€

Java 闆嗗悎

CF1349F1

poj3977 - subset - the second time - 暴力 + 二分