Cod sursa(job #109427)

Utilizator t_ralucaTrofin Raluca t_raluca Data 25 noiembrie 2007 11:02:11
Problema Multimi2 Scor 30
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 5-8 Marime 1.85 kb
#include <stdio.h>
long int n, s1, s2, dmin, i, j, p1, p2, v1[5000], v2[5000];



void citesteDate(){
FILE *f;
f=fopen("multimi2.in", "r");
fscanf(f, "%ld", &n);
fclose(f);
}

void determinareSumeP(){
i=1; j=n;  s1=0; s2=0;
  p1=-1; p2=-1;
  int k=1;
  while(i<j){
     if(k%2==1){

     if((p1+2)==n/2) {
	  p1++; p2++;
	  v1[p1]=i;v2[p2]=j;
	  s1=s1+i; s2=s2+j;
       }
       else{
	   p1++;
	   v1[p1]=i; s1=s1+i;
	   p1++;
	   v1[p1]=j; s1=s1+j;
       }
     }
     else{
       if(p2+1==n/2){}
       else{
	  p2++;
	  v2[p2]=i; s2=s2+i;
	  p2++;
	  v2[p2]=j; s2=s2+j;
       }
     }
     i++; j--; k++;
  }


}

void determinaSumeI(){
long int nr_ramase;

v1[0]=1; v1[1]=2;
v2[0]=3;
p1=1; p2=0;   s1=3;
i=4; j=n;     s2=3;
int k=1;
nr_ramase=n-3;

  while(i<j){
     if(k%2==1){

     if(nr_ramase==2) {
	  p1++; p2++;
	  v1[p1]=i;v2[p2]=j;
	  s1=s1+i; s2=s2+j;
       }
       else{
	   p1++;
	   v1[p1]=i; s1=s1+i;
	   p1++;
	   v1[p1]=j; s1=s1+j;
       }
     }
     else{
       if(p2+1==n/2){}
       else{
	  p2++;
	  v2[p2]=i; s2=s2+i;
	  p2++;
	  v2[p2]=j; s2=s2+j;
       }
     }
     i++; j--; k++; nr_ramase-=2;
}
}



int main(){
citesteDate();
FILE *f;

f=fopen("multimi2.out", "w");
if(n%2==0){
  determinareSumeP();
}
else{
  determinaSumeI();
}

  //diferenta minima
  if(s1>s2){
    dmin=s1-s2;
    fprintf(f,"%ld\n", dmin);
  }
  else{
     dmin=s2-s1;
     fprintf(f,"%ld\n", dmin);
  }

  //numarul de elemente din prima multime
  fprintf(f, "%ld\n", p1+1);
  //elementele din prima multime
  for(i=0; i<=p1; i++){
     fprintf(f, "%ld ", v1[i]);
  }
  //numarul de elemente din a doua multime
  fprintf(f, "\n%ld\n", p2+1);
  //elem din a doua multime
  for(i=0; i<=p2; i++){
     fprintf(f, "%ld ", v2[i]);
  }

fclose(f);
return 0;
}