Cod sursa(job #1116091)

Utilizator robertstrecheStreche Robert robertstreche Data 22 februarie 2014 12:31:21
Problema Subsir 2 Scor 76
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
#define lmax 5001
#define inf 10000000

using namespace std;

ifstream f("subsir2.in");
ofstream g("subsir2.out");

long long i,j,n,mi=inf,mii,sol,ma,maa=inf,poz,nr;
long long a[lmax],b[lmax],ok[lmax],urm[lmax];

int main()
{
    f>>n;

    for (i=1;i<=n;i++)
     {
        f>>a[i];
        if (a[i]<mi)
         {
             mi=a[i];
             ok[i]=1;
         }
     }
     sol=lmax;
    for (i=n;i>=1;i--)
     {
        mi=inf;
        b[i]=inf;
        urm[i]=-1;

        for (j=i+1;j<=n;j++)
          {
           if (a[i]<=a[j])
              if (a[j]<mi && (b[i]>b[j]+1 || (b[i]==b[j]+1 && a[j]<a[urm[i]])))
                {
                    urm[i]=j;
                    b[i]=b[j]+1;

                 if (a[j]<mi)
                   mi=a[j];
                }

            }
           if (b[i]==inf)
            {
                b[i]=1;
                urm[i]=i;
            }

          if(ok[i]&&(sol>b[i]||(sol==b[i]&&a[i]<a[poz])))
            {
                poz=i;
                sol=b[i];
            }
    }

     g<<sol<<'\n';

      while (1)
       {
           g<<poz<<" ";

          if (urm[poz]==poz)
            break;
          poz=urm[poz];
       }


    f.close();
    g.close();
}


/*#include<fstream>
using namespace std;
ifstream f("subsir2.in");
ofstream g("subsir2.out");
int maxi,poz,mini,sol,min1,i,j,n,a[5001],l[5001],p[5001],ok[5001];
int main()
{f>>n;
min1=1000000;
for(i=1;i<=n;++i)
{f>>a[i];
if(a[i]<min1)
{min1=a[i];
ok[i]=1;
}
}
sol=100000;
for(i=n;i;--i)
{mini=l[i]=100000;
p[i]=-1;
for(j=i+1;j<=n;++j)
{if(a[i]>a[j]) continue;
if(a[j]<mini&&(l[i]>l[j]+1||(l[i]==l[j]+1&&a[j]<a[p[i]])))
{l[i]=l[j]+1;
p[i]=j;
}
if(a[j]<mini)
	mini=a[j];
}
if(l[i]==100000)
{l[i]=1;
p[i]=i;
}
if(ok[i]&&(sol>l[i]||(sol==l[i]&&a[i]<a[poz])))
{poz=i;
sol=l[i];
}
}
g<<sol<<'\n';
while(1)
{g<<poz<<' ';

if(poz==p[poz])
	break;
poz=p[poz];
}

g<<'\n';
return 0;
}
*/