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>姣曠珶浜哄鐨勫彟涓€涓悕瀛楀彨鏈寸礌绠楁硶#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 鎶樺崐鏋氫妇的主要内容,如果未能解决你的问题,请参考以下文章