Cod sursa(job #2324588)

Utilizator AxellApostolescu Alexandru Axell Data 21 ianuarie 2019 03:09:53
Problema Subsir crescator maximal Scor 20
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>
#include <stdlib.h>
typedef struct {
	int ct; // Numarul de elemente
	int starting_index; // Indexul de inceput
} seq;

void search(int n, int *v, FILE* out);
void print_sequence(seq *s, int *v ,FILE* out);

int main() {
	int n, *v;
	// Programare defensiva
	FILE* in = fopen("scmax.in", "rt");
	if (in == NULL) {
		printf("Could not open the input file!\n");
		return -1;
	}
	FILE* out = fopen("scmax.out", "wt");
	if (out == NULL) {
		printf("Could not open the output file!\n");
		return -2;
	}
	// Citire
	fscanf(in, "%d", &n);
	v = malloc(n * sizeof(int));
	for (int i = 0 ; i < n ; ++i) {
		fscanf(in, "%d", &v[i]);
	}
	// Executie
	search(n, v, out);
	// Eliberare memorie
	free(v);
	fclose(in);
	fclose(out);
	return 0;
}

void search(int n, int *v, FILE* out) {
	int i, prev = 0;
	seq s, best;
	best.ct = 0;
	best.starting_index = 0;
	s.ct = 0;
	s.starting_index = 0;
	for (i = 0 ; i < n ; ++i) {
		if (v[i] > prev) {
			s.ct++;
		}
		// Daca se termina secventa
		if (v[i] < prev) {
			// Verificam lungimile
			if (s.ct > best.ct) {
				best.ct = s.ct;
				best.starting_index = s.starting_index;
			}
			s.ct = 1;
			s.starting_index = i;
		}
		prev = v[i];
	}
	if (s.ct > best.ct) {
		print_sequence(&s, v, out);
	} else {
		print_sequence(&best, v, out);
	}
}

void print_sequence(seq *s, int *v ,FILE* out) {
	int i = 0, prev = 0;
	fprintf(out, "%d\n", s->ct);
	while (i < s->ct) {
		if (v[s->starting_index + i] != prev) {
			fprintf(out, "%d ", v[s->starting_index + i]);
			prev = v[s->starting_index + i];
		} else {
			s->ct++;
		}
		i++;
	}
	fprintf(out, "\n");
}