
Untitled
By: a guest on
Aug 3rd, 2012 | syntax:
C++ | size: 2.92 KB | hits: 16 | expires: Never
//#pragma comment(linker, "/STACK:16777216")
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[10001];
int b[10001];
bool used[10001];
int d[2*10001];
int ololo[2*10001];
int ololo2[2*10001];
int ololo3[2*10001];
void fill(int a [], int n)
{
for (int i = 0; i<n;i++)
{
a[i] = 0;
}
}
void qSort(int A [],int b[], int low, int high) {
int i = low;
int j = high;
int x = A[(low+high)/2];
do {
while(A[i] < x) ++i;
while(A[j] > x) --j;
if(i <= j){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
temp = b[i];
b[i] = b[j];
b[j] = temp;
i++; j--;
}
} while(i <= j);
if(low < j) qSort(A,b, low, j);
if(i < high) qSort(A,b,i, high);
}
int min (int a, int b)
{
if (a<b) return a;
return b;
}
int main () {
int n = 0;
scanf("%d",&n);
for (int i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
if (n==1)
{
cout<<1<<endl;
cout<<a[0];
return 0;
}
int sum = 0;
for (int i = 0; i <n; i++)
{
if (a[i]%n==0){
cout<<1<<endl;
cout<<a[i];
return 0;
}
b[i] = a[i] % n;
sum+=b[i];
}
int k = sum % n;
qSort(b,a,0,n-1);
fill(d,k+n+1);
d[0] = 1;
fill(ololo,k+n+1);
fill(ololo2,k+n+1);
fill(ololo3,k+n+1);
int fuuuu = 0;
for (int i = 0; i <n; i++){
fuuuu = min(fuuuu+b[i],n);
for (int j = fuuuu; j>=b[i]; j--){
if (d[j-b[i]]==1 && ololo[j]==0){
d[j] = d[j-b[i]];
ololo[j] = a[i];
ololo2[j] = b[i];
ololo3[j] = i;
}
else d[j] = max(d[j],d[j-b[i]]);
}
}
if (d[k]==0){
fill(d,n);
d[0] = 1;
fill(ololo,n);
fill(ololo2,n);
fill(ololo3,n);
int fuuu = 0;
for (int i = 0; i <n; i++){
fuuu = min(fuuu+b[i],n+k);
for (int j = fuuu; j>=b[i]; j--){
if (d[j-b[i]]==1 && ololo[j]==0){
d[j] = d[j-b[i]];
ololo[j] = a[i];
ololo2[j] = b[i];
ololo3[j] = i;
}
else d[j] = max(d[j],d[j-b[i]]);
}
}
k = n+k;
}
int fuuu = 0;
while(k!=0){
used[ololo3[k]] = true;
fuuu++;
k-=ololo2[k];
}
printf("%d\n",(n-fuuu));
for (int i = 0; i < n; i++){
if (!used[i]){
printf("%d\n",a[i]);
}
}
return 0;
}