Cod sursa(job #1474133)

Utilizator BodStfBodoarca Stefan BodStf Data 21 august 2015 00:18:03
Problema Elementul majoritar Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
#include<malloc.h>

void merge(int *v,int l,int m,int r)
{
	int *vp=(int*)malloc((r-l+1)*sizeof(int));//vetor intermediar
	int 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(int *v,int l,int r)
{
	if(l==r) return;
	int m=(l+r)/2;
	mergesort(v,l,m);
	mergesort(v,m+1,r);
	merge(v,l,m,r);
}

int main()
{
	int count=1;
	FILE* f1,*f2;
	f1=fopen("elmaj.in","r");
	f2=fopen("elmaj.out","w");
	if(!f1 || !f2)
	{
		printf("eroare deschidere fisier!\n");
		return -1;
	}

	int n,*v,ok=0;
	fscanf(f1,"%d",&n);
	v=(int*)malloc(n*sizeof(int));
	for(int i=0;i<n;i++)
		fscanf(f1,"%d",&v[i]);
	mergesort(v,0,n-1);
	for(int i=0;i<n-1;i++)
	{
		if(v[i]==v[i+1])
			count++;
		else ok=1;
		if(ok && count>=n/2+1)
			fprintf(f2,"%d %d\n",v[i],count);
		if(ok)
		{
			count=1;
			ok=0;
		}
	}
	free(v);
	return 0;
}