Cod sursa(job #22022)

Utilizator robbyRobertino robert robby Data 25 februarie 2007 13:58:29
Problema Cifra Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int a[1001],b[1001];
int n,i,j;
long s2,s,min,nr,aux,s3,ok,k,v;

int compare(const void *a,const void *b)
{
  return *(int*)b-*(int*)a;
}

FILE *f,*g;
int main()
{
   f=fopen("jocul.in","rt");
   g=fopen("jocul.out","wt");
   fscanf(f,"%d",&n);
   s=0;
   for (i=1;i<=n;i++)
	 {
	   fscanf(f,"%d",&a[i]);
	   s+=a[i];
	 }
   nr=(s+1)/2;
   min=nr;
   s2=0;
   aux=s%2;
   qsort(a+1,n,sizeof(int),compare);
   k=1;
   b[1]=0;
   s2=0;
   while (k>0)
	 {
		v=0;
		while (v==0&&b[k]<n)
		  {
			s2-=a[b[k]];
			b[k]++;
			s2+=a[b[k]];
			if (s2<=nr)
				v=1;
		  }
		if (!v)
		  {
			k--;
			s2-=a[b[k+1]];
		  }
		   else
			 if (nr-s2<min)
				  {
					s3=s2;
					min=nr-s2;
					if (nr-s2==aux)
					  break;
					 else
					  if (b[k]<n)
					   {
						 k++;
						 b[k]=b[k-1];
						 s2+=a[b[k-1]];
//						 if (abs(nr-s2-a[b[k]])<min)
//						   {
//							 s3=s2+a[b[k]];
//							 min=abs(nr-s2-a[b[k]]);
//							 if (abs(nr-s2-a[b[k]])==aux)
//							   break;
//						   }
					   }
				  }
				else
					{
					 k++;
					 b[k]=b[k-1]+1;
					}
	 }
   if (s-s3>s3)
	 fprintf(g,"%ld %ld\n",s3,s-s3);
	else
	  fprintf(g,"%ld %ld\n",s-s3,s3);
   fclose(f);
   fclose(g);
   return 0;
}