Pagini recente » Cod sursa (job #70145) | Cod sursa (job #2564156) | Cod sursa (job #1576956) | Cod sursa (job #139912) | Cod sursa (job #764874)
Cod sursa(job #764874)
#include <stdio.h>
int subseqLen[100001], seq[100001], N, maxLen;
int findBest(int k);
int main()
{
FILE *in, *out;
int i, best;
/*reading the input*/
in = fopen("scmax.in", "r");
fscanf(in, "%d", &N);
for(i = 0; i < N; i++)
fscanf(in, "%d", &seq[i]);
fclose(in);
/*done reading the input*/
for(i = 0; i < N; i++)
{
best = findBest( seq[i] );
if(best == maxLen)
subseqLen[++maxLen] = seq[i];
else if(subseqLen[best+1] > seq[i])
subseqLen[best+1] = seq[i];
}
/*writing the output*/
out = fopen("scmax.out", "w");
fprintf(out, "%d\n", maxLen);
for(i = 1; i <= maxLen; i++)
fprintf(out, "%d ", subseqLen[i]);
fprintf(out, "\n");
fclose(out);
return 0;
}
int findBest(int value)
{
int l, r, middle;
l = 0;
r = maxLen + 1;
while(l + 1 < r)
{
middle = (r - l) / 2 + l;
if(subseqLen[middle] < value)
l = middle;
else
r = middle;
}
return l;
}