QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#32217#2571. Aidana and PitaRobeZH#WA 3ms3784kbC++2.6kb2022-05-18 05:37:482022-05-18 05:37:49

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-05-18 05:37:49]
  • 评测
  • 测评结果:WA
  • 用时:3ms
  • 内存:3784kb
  • [2022-05-18 05:37:48]
  • 提交

answer

#include<bits/stdc++.h>
#define rep(i,n) for(int i=1;i<=n;++i)
#define st first
#define nd second
using namespace std;
typedef long long ll;
typedef pair<int,int> pr;
const int N=30;
int a[N],cpy[N],n,sum,ans,s[N],now[N];
int it = 0;
bool should_stop() {
    return (++it) % 10000 == 0 && (double)clock() / CLOCKS_PER_SEC > 1.9;
}
int ot[N];
void dfs(int pos,int x,int y,int z,int my,int mz){
    if(should_stop()){
        rep(i,n){
            rep(j,n)if(cpy[j]==a[i]){
                    cpy[j]=0;
                    ot[j]=s[i];
                    break;
                }
        }
        //printf("%d\n",ans);
        rep(i,n)printf("%d%c",ot[i]," \n"[i==n]);
        exit(0);
    }
//    rep(i,pos-1)printf("%d ",now[i]);
//    puts("");
    int res=sum-x-y-z,xx=x,yy=y,zz=z;
    if(xx>yy)res-=xx-yy,yy=xx;
    if(yy>zz)res-=yy-zz,zz=yy;
//    if(res<0)return;
//    if(xx+res<yy-my)return;
//    if(max(0,zz-mz-x)+max(0,zz-mz-y)>res)return;
//    if(max(0,zz-ans+1-x)+max(0,zz-ans+1-y)>res)return;
    if(pos==n+1){
        if(z-x<ans){
            ans=z-x;
            rep(i,n)s[i]=now[i];
        }
        return;
    }
    if(a[pos-1]!=a[pos]||now[pos-1]==1){
        now[pos]=1;dfs(pos+1,x+a[pos],y,z,my,mz);
    }
    if(a[pos-1]!=a[pos]||now[pos-1]<=2){
        now[pos]=2;dfs(pos+1,x,y+a[pos],z,min(my,a[pos]),mz);
    }
    now[pos]=3;dfs(pos+1,x,y,z+a[pos],my,min(mz,a[pos]));
}
int tmp[4];
int find(){
    tmp[1]=tmp[2]=tmp[3]=0;
    rep(i,n)
        if(tmp[1]<=tmp[2]&&tmp[1]<=tmp[3])tmp[1]+=a[i];
        else if(tmp[2]<=tmp[1]&&tmp[2]<=tmp[3])tmp[2]+=a[i];
        else tmp[3]+=a[i];
    int ret=0;
    ret=max(ret,abs(tmp[1]-tmp[2]));
    ret=max(ret,abs(tmp[2]-tmp[3]));
    ret=max(ret,abs(tmp[3]-tmp[1]));
    return ret;
}
void init(){
    ans=sum+1;
    sort(a+1,a+n+1);
    ans=min(ans,find()+1);
    reverse(a+1,a+n+1);
    ans=min(ans,find()+1);
    rep(tim,100){
        random_shuffle(a+1,a+n+1);
        ans=min(ans,find()+1);
    }
}
int main() {
    scanf("%d",&n);
    //n=20;
    rep(i,n){
        scanf("%d",a+i);
        //a[i]=i*i;
        sum+=a[i],cpy[i]=a[i];
    }
    init();
    sort(a+1,a+n+1);
    a[0]=0;a[n+1]=sum+1;
    dfs(1,0,0,0,sum,sum);
    //printf("%d\n",ans);
    rep(i,n){
        rep(j,n)if(cpy[j]==a[i]){
                cpy[j]=0;
                ot[j]=s[i];
                break;
            }
    }
    //printf("%d\n",ans);
    rep(i,n)printf("%d%c",ot[i]," \n"[i==n]);
    return 0;
}
/*
20
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
 */

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 3ms
memory: 3784kb

input:

5
2 3 1 4 2

output:

1 1 1 1 1

result:

wrong answer expected 0, found 12