Submission

Status:

---P--P-P-

Subtask/Task Score:

30/100

Score: 30

User: spammer_destroyer

Problemset: ประลอง

Language: cpp

Time: 0.002 second

Submitted On: 2025-10-20 12:22:27

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int test(vector<int> x1,vector<int> x2, int n, int n1) {
  int i,dif=0;
  for(i=0;i<n1;i++) {
    //cout << x1[i] << " ";
    dif+=x1[i];
  }
  //cout << "\n";
  for(i=0;i<n-n1;i++) {
    //cout << x2[i] << " ";
    dif-=x2[i];
  }
  //cout << "/dif=" << dif << "\n";
  return dif;
}
void copy(vector<int>& min_x1, vector<int>& min_x2, vector<int> x1, vector<int> x2, int n, int n1) {
  int i;
  for(i=0;i<n1;i++) {
    min_x1[i]=x1[i];
  }
  for(i=0;i<n-n1;i++) {
    min_x2[i]=x2[i];
  }
}
void show(vector<int> min_x1, vector<int> min_x2, vector<int> lock_arr, int n, int n1) {
  int i,j;
  //print min_x1 first
  bool pass_min_x1[n1]={};
  for(i=0;i<n;i++) {
    for(j=0;j<n1;j++) {
      if(pass_min_x1[j]==false) {
        if(lock_arr[i]==min_x1[j]) {
          pass_min_x1[j]=true;
          cout << min_x1[j] << " ";
        }
      }
    }
  }
  cout << "\n";
  bool pass_min_x2[n-n1]={};
  for(i=0;i<n;i++) {
    for(j=0;j<n-n1;j++) {
      if(pass_min_x2[j]==false) {
        if(lock_arr[i]==min_x2[j]) {
          pass_min_x2[j]=true;
          cout << min_x2[j] << " ";
        }
      }
    }
  }
}
int main() 
{
    int n,i,j,n1,dif,min_dif;
    bool stop;
    cin >> n;
    if(n%2==0) {
      n1=n/2;
    }
    else if(n%2==1) {
      n1=(n-1)/2;
    }
    vector<int> x1(n1),x2(n-n1),arr(n),lock_arr(n);
    vector<int> min_x1(n1),min_x2(n-n1);
    for(i=0;i<n;i++) {
      cin >> arr[i];
      lock_arr[i]=arr[i];
    }
    sort(arr.begin(),arr.end());
    //begin setup 2 sets
    int ix1=0,ix2=0;
    for(i=0;i<n;i++) {
      //store in x1
      if(i%2==0) {
        x2[ix2]=arr[i];
        ix2++;
      }
      //store in x2
      else if(i%2==1) {
        x1[ix1]=arr[i];
        ix1++;
      }
    }
    dif=test(x1,x2,n,n1);
    min_dif=abs(dif);
    copy(min_x1,min_x2,x1,x2,n,n1);
    //now slowly repair
  int l;stop=false;
  for(l=0;l<=n;l++) {
    for(i=0;i<n1;i++) {
      for(j=0;j<n-n1;j++) {
        if(dif>0) {
          if(x1[i]>x2[j]) {
            swap(x1[i],x2[j]);
          }
        }
        else if(dif<0) {
          if(x1[i]<x2[j]) {
            swap(x1[i],x2[j]);
          }
        }
        if(min_dif==0) {
          stop=true;break;
        }
        dif=test(x1,x2,n,n1);
        if(abs(dif)<=abs(min_dif)) {
          min_dif=abs(dif);
          copy(min_x1,min_x2,x1,x2,n,n1);
        }
      }
      if(stop==true) {break;}
    }
  }
  //show(min_x1,min_x2,lock_arr,n,n1);cout << "\n";
  //debug
    //swap first setup
    for(i=0;i<n1;i++) {
      swap(x1[i],x2[i]);
    }
    //find min again
  stop=true;
  for(l=0;l<=n;l++) {
    for(i=0;i<n1;i++) {
      for(j=0;j<n-n1;j++) {
        if(dif>0) {
          if(x1[i]>x2[j]) {
            swap(x1[i],x2[j]);
          }
        }
        else if(dif<0) {
          if(x1[i]<x2[j]) {
            swap(x1[i],x2[j]);
          }
        }
        if(min_dif==0) {
          stop=true;break;
        }
        dif=test(x1,x2,n,n1);
        if(abs(dif)<=abs(min_dif)) {
          min_dif=abs(dif);
          copy(min_x1,min_x2,x1,x2,n,n1);
        }
      }
      if(stop==true) {break;}
    }
  }
  /*//debug
    cout << "\n--\n";
    for(i=0;i<n1;i++) {
      cout << min_x1[i] << " ";
    }
    cout << "\n";
    for(i=0;i<n-n1;i++) {
      cout << min_x2[i] << " ";
    }
    cout << "\n\n";*/
    show(min_x1,min_x2,lock_arr,n,n1);
    return 0;
    
}