印尼巴厘島的公路上有許多的雕塑,咱們來關注它的一條主幹道。ios
在這條主幹道上一共有 NN 座雕塑,爲方便起見,咱們把這些雕塑從 11 到 NN 連續地進行標號,其中第 ii 座雕塑的年齡是 YiYi 年。爲了使這條路的環境更加優美,政府想把這些雕塑分紅若干組,並經過在組與組之間種上一些樹,來吸引更多的遊客來巴厘島。ide
下面是將雕塑分組的規則:atom
請問政府能獲得的最小的最終優美度是多少?spa
備註:將兩個非負數 PP 和 QQ 按位取或是這樣進行計算的:code
輸入的第一行包含三個用空格分開的整數 N,A,BN,A,B。orm
第二行包含 NN 個用空格分開的整數 Y1,Y2,…,YNY1,Y2,…,YN。xml
輸出一行一個數,表示最小的最終優美度。blog
6 1 3 8 1 2 1 5 4
11
將這些雕塑分爲 22 組,(8,1,2)(8,1,2) 和 (1,5,4)(1,5,4),它們的和是 (11)(11) 和 (10)(10),最終優美度是 (11OR10)=11(11OR10)=11。(不難驗證,這也是最終優美度的最小值。)ci
時間限制:1s1sinput
空間限制:64MB
#include<iostream> #include<cstdio> #include<cstring> #define maxn 110 using namespace std; int n,A,B,w[maxn],cnt; long long b[maxn],ans=1000000000000000LL; long long check(int sta){ long long res=0; cnt=1; b[1]=0; for(int i=1;i<n;i++){ b[cnt]+=w[i]; if(sta&(1<<(i-1))){ res|=b[cnt]; cnt++; b[cnt]=0; } if(cnt>B)return -1; } if(cnt<A)return -1; b[cnt]+=w[n]; res|=b[cnt]; return res; } int main(){ scanf("%d%d%d",&n,&A,&B); for(int i=1;i<=n;i++)scanf("%d",&w[i]); for(int i=0;i<(1<<(n-1));i++){ long long now=check(i); if(now!=-1) ans=min(ans,now); } cout<<ans<<endl; }
#include<iostream> #include<cstdio> #include<cstring> #define INF 0x3f3f3f3f #define maxn 2010 using namespace std; int f[105][105],g[maxn],n,A,B; long long a[maxn],sum[maxn],ans; void solve1(){ for(int pos=45;pos>=0;pos--){ memset(f,1,sizeof(f)); f[0][0]=0; for(int i=1;i<=n;i++) for(int j=1;j<=B;j++) for(int k=0;k<i;k++) if(f[k][j-1]==0 && (((sum[i]-sum[k])>>pos)&1)==0 && (((sum[i]-sum[k])|ans)>>pos)==(ans>>pos)){ f[i][j]=0; break; } bool flag=0; for(int i=A;i<=B;i++) if(f[n][i]==0){flag=1;break;} if(!flag)ans|=1LL<<pos; } cout<<ans<<endl; } void solve2(){ for(int pos=51;pos>=0;pos--){ for(int i=1;i<=n;i++)g[i]=INF; g[0]=0; for(int i=1;i<=n;i++) for(int j=0;j<i;j++){ if((((sum[i]-sum[j])>>pos)&1))continue; if((((sum[i]-sum[j])|ans)>>pos)==(ans>>pos)) g[i]=min(g[i],g[j]+1); } if(g[n]>B)ans|=1LL<<pos; } cout<<ans<<endl; } int main(){ scanf("%d%d%d",&n,&A,&B); for(int i=1;i<=n;i++){ cin>>a[i]; sum[i]=sum[i-1]+a[i]; } if(A==1)solve2(); else solve1(); return 0; }