Pagini recente » Cod sursa (job #341836) | Cod sursa (job #2349114) | Cod sursa (job #2685676) | Cod sursa (job #1468138) | Cod sursa (job #823339)
Cod sursa(job #823339)
/*
* cadouri.c
*
* Created on: Nov 15, 2012
* Author: Veronica-Mihaela Velciu
*/
#include<stdio.h>
#include<stdlib.h>
void read_data ( int *v, int n, FILE* fp){
int i;
for( i=1; i<=n; i++)
fscanf(fp,"%d", &v[i]);
}
int get_subsequence( int *v, int n, int *sub ) {
int M[100], P[100], L=1, i,j;
v[0]=-1;
M[0]=0;M[1]=1;
for( i=2; i<=n; i++ ) {
j = binary_search(v, M, 0, L, i);
P[i]=M[j];
M[j+1] = i;
if( L<j+1 )
L=j+1;
}
int last = M[L];
i=L;
while( i>0 ) {
sub[i]=last;
last=P[last];
i--;
}
return L;
}
int binary_search( int *v, int* M, int start, int end, int i) {
int mij = (start+end)/2;
while(start<end) {
if ( v[M[mij]] < v[i] && v[M[mij+1]] >= v[i] )
return mij;
if( v[M[mij+1]] < v[i] )
{ start=mij+1; mij = (start+end)/2;}
else
{ end=mij-1; mij = (start+end)/2;}
}
return end;
}
void write_data ( int *v, int n, char* out_file ){
int i;
FILE * fp;
fp = fopen(out_file,"w");
for( i=1; i<=n; i++ )
fprintf( fp, "%d ", v[i]);
fclose(fp);
}
int main() {
//if( argc == 3 ) {
int n, *P, *sub, L;
FILE *fp;
fp = fopen("scmax.in","r");
fscanf(fp,"%d", &n);
P = malloc( (n+1)*sizeof(int) );
sub = malloc( (n+1)*sizeof(int) );
read_data( P, n, fp );
fclose(fp);
L = get_subsequence( P, n, sub );
write_data( sub, L, "scmax.out" );
free(P);
free(sub);
return 0;
//}
//else {
// fprintf( stderr, "Usage: ./main input_file output_file\n");
// return -1;
//}
}