Cod sursa(job #791172)

Utilizator dbalutaDaniel Baluta dbaluta Data 23 septembrie 2012 11:58:36
Problema Elementul majoritar Scor 80
Compilator c Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>
#include <stdlib.h>

int *read_data(int *size)
{
	int n, i;
	int *v;
	
	FILE *f = fopen("elmaj.in", "r");
	if (!f) 
		return NULL;
	
	fscanf(f, "%d", &n);
	*size = n;
	
	v = malloc(n * sizeof(int));
	for (i = 0; i < n; i++) 
		fscanf(f, "%d", &v[i]);
	
	return v;
}

void print_vec(int *v, int size)
{
	int i;

	for (i = 0; i < size; i++) 
		printf("%d ", v[i]);
	printf("\n");
}

int check_maj(int *v, int size, int n, int *app)
{
	int i, count = 0;
	
	for(i = 0; i < size; i++) {
		if (v[i] == n) 
			count++;
	}
	*app = count;
	printf("Checking elmaj for %d, size %d, count %d\n", n, size, count);
	return count >= size/2 + 1;
}
 
void solve(int *v, int size)
{
	int i, app;
	FILE *f = fopen("elmaj.out", "w");
	if (!f) 
		return;
	for (i = 0; i < size-1; i+=2) {
		printf("Checking indexes (%d, %d) -> (%d, %d) \n", i, i+1, v[i], v[i+1]);
		
		if (v[i] == v[i+1]) {
			if (check_maj(v, size, v[i], &app)) {
				fprintf(f, "%d %d\n", v[i], app);
				return ;
			}
		}
	}
	
	if (size % 2 == 1 && check_maj(v, size, v[size-1], &app)) {
		fprintf(f, "%d %d\n", v[size-1], app);
		return ;
	}
	fprintf(f, "-1\n");		
}

int main(void)
{
	int size;
	int *v;
		
	v = read_data(&size);
		
	print_vec(v, size);
	solve(v, size);

	return 0;
}