题解:AT_abc200_d [ABC200D] Happy Birthday! 2
这个题我们可以先打一个暴力代码。我们枚举
暴力代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[201],q[201],p[201];
int t,ans1,ans2;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
}
for(int i=1;i<=(1<<n)-1;i++){
for(int j=1;j<=(1<<n)-1;j++){
if(i==j){
continue;
}
ans1=0,ans2=0;
t=1;
q[0]=p[0]=0;
while(t<=n){
if(i&(1<<(t-1))){
ans1+=a[t];
q[++q[0]]=t;
ans1%=200;
}
if(j&(1<<(t-1))){
ans2+=a[t];
p[++p[0]]=t;
ans2%=200;
}
++t;
}
if(ans1==ans2){
puts("Yes");
for(int j=0;j<q[0];j++){
printf("%d ",q[j]);
}
printf("%d\n",q[q[0]]);
for(int j=0;j<p[0];j++){
printf("%d ",p[j]);
}
printf("%d\n",p[p[0]]);
return 0;
}
}
}
puts("No");
return 0;
}
我们考虑优化。前文已经提到,对于长度为
这有什么用呢?当
AC 代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[9],q[9],p[9];
int t,ans1,ans2;
int main(){
scanf("%d",&n);
n=min(n,8);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
}
for(int i=1;i<=(1<<n)-1;i++){
for(int j=1;j<=(1<<n)-1;j++){
if(i==j){
continue;
}
ans1=0,ans2=0;
t=1;
q[0]=p[0]=0;
while(t<=n){
if(i&(1<<(t-1))){
ans1+=a[t];
q[++q[0]]=t;
ans1%=200;
}
if(j&(1<<(t-1))){
ans2+=a[t];
p[++p[0]]=t;
ans2%=200;
}
++t;
}
if(ans1==ans2){
puts("Yes");
for(int j=0;j<q[0];j++){
printf("%d ",q[j]);
}
printf("%d\n",q[q[0]]);
for(int j=0;j<p[0];j++){
printf("%d ",p[j]);
}
printf("%d\n",p[p[0]]);
return 0;
}
}
}
puts("No");
return 0;
}