Cod sursa(job #1481547)

Utilizator BodStfBodoarca Stefan BodStf Data 4 septembrie 2015 19:06:25
Problema Elementul majoritar Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
#include<malloc.h>

long N,count,*v;

void merge(long *v,long l,long m,long r)
{
	long *vp=(long*)malloc((r-l+1)*sizeof(long));//vetor intermediar
	long i=l,j=m+1,k=0,s=0;

	while(i<=m && j<=r)
	{
		if(v[i]<=v[j])
		{
			vp[k]=v[i];
			i++;
		}
		else
		{
			vp[k]=v[j];
			j++;
		}
		k++;
	}

	if(i>m)
		for(s=j;s<=r;s++)
		{
			vp[k]=v[s];
			k++;
		}
	else
		for(s=i;s<=m;s++)
		{
			vp[k]=v[s];
			k++;
		}

	for(s=0;s<=r-l;s++)
		v[l+s]=vp[s];

	free(vp);
}

void mergesort(long *v,long l,long r)
{
	if(l==r) return;
	long m=(l+r)/2;
	mergesort(v,l,m);
	mergesort(v,m+1,r);
	merge(v,l,m,r);
}

int main()
{
	FILE* f1,*f2;
	f1=fopen("elmaj.in","r");
	f2=fopen("elmaj.out","w");
	fscanf(f1,"%ld",&N);
	v=(long*)malloc(N*sizeof(long));
	for(int i=0;i<N;i++)
		fscanf(f1,"%ld",&v[i]);
	mergesort(v,0,N-1);
	int i;
	for(i=0;i<N;i++)
		if(v[i]==v[N/2])
			count++;
	if(count>N/2)
		fprintf(f2,"%ld %ld",v[N/2],count);
	else fprintf(f2,"%-1\n");
	return 0;
}