Cod sursa(job #480985)

Utilizator marius.bucurBucur Marius - Ovidiu marius.bucur Data 30 august 2010 12:29:02
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<cstdio>
#include<cstdlib>
#include<climits>
#include<fstream>
#include<iostream>
#include<map>
#include<vector>
#define MAXN 5002
#define max(a, b) (a>b?a:b)
#define min(a, b) (a>b?b:a)
using namespace std;

std::map<int, int> all;
int A[MAXN];
int vec[MAXN];
int N;
int mcount;
int pos[MAXN];

int get_next(int i) {
	int rpos = pos[i];
	if(i == 0) {
		while(rpos < N && vec[rpos] != A[0])
			rpos++;
		if(rpos == N)
			return -1;
		return rpos;
	}
	else {
		rpos = max(pos[i-1], rpos);
		while(rpos < N && vec[rpos] != A[i])
			rpos++;
		if(rpos == N)
			return -1;
		return rpos;
	}
}

int main() {
	ifstream in("secv.in");
	ofstream out("secv.out");
	in >> N;
	for(int i = 0; i < N; i++) {
		in >> vec[i];
		all[vec[i]] = 1;
	}
	int i = 0;
	for(std::map<int, int>::iterator it = all.begin(); it != all.end(); it++) {
		A[i++] = it->first;
	}
	mcount = i;
	int cur_min = INT_MAX;
	while(true) {
		for(i = 0; i < mcount; i++) {
			pos[i] = get_next(i);
			if(pos[i] == -1)
				goto done;
			printf("%d ", pos[i]);
		}
		cur_min = min(pos[mcount - 1] - pos[0], cur_min);
		printf("\n");
		pos[0]++;
	}
	done:
	printf("[%d]\n", cur_min);
	if(cur_min == INT_MAX)
		cur_min = -2;
	out << (cur_min + 1);
	return 0;
}