Cod sursa(job #1041359)

Utilizator Catalina_BrinzaBrinza Catalina Catalina_Brinza Data 25 noiembrie 2013 19:27:52
Problema Order Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
//
//  main.cpp
//  order
//
//  Created by Catalina Brinza on 11/19/13.
//  Copyright (c) 2013 Catalina Brinza. All rights reserved.
//


#include <fstream>
#include <math.h>



using namespace std;
ifstream f("order.in");
ofstream g("order.out");

int main()
{int n,k,i,m,j,l,p=0;
    f>>n;
    int s[175];
    bool a[30001];
    
    k=sqrt(n);
    if (k*k==n) {p=k;s[p]=k;}
    else if (n%k==0) {p=n/k; s[p]=n-(p-1)*k;}
    else {p=n/k+1;s[p]=n%k;}
    for (i=1;i<=p-1;++i) s[i]=k;
    for (i=1;i<=n;++i) a[i]=false;
    m=n;
    j=2;
    i=1;

    while (m!=0)
    {
        a[j]=true;
        g<<j<<' ';
        m--;
        if (m==0) break;
        i++;
        int q=j/k+1;
        if (j%k==0) q--;
        s[q]--;
      

        int nr=i, poz=j;
 
        for (l=j+1;l<q*k+1 && l<=n;++l)
            if (!a[l]) {poz=l;  nr--; if (nr==0) break;}
        if (nr==0) {j=poz;}
        else {
        while (nr>0)
        {
            q++;
            
            while (s[q]==0)
            {q++;
                if (q>p) q=1;}
            if (q>p) q=1;
            nr-=s[q];
            
        }
           
        if (nr==0)
        {
           
            if (q==p)
            {for (l=n;l>(q-1)*k;l--)
                if (!a[l]) { j=l; break;}}
            else for (l=q*k;l>0;--l)
                if (!a[l]) { j=l; break;}
                
        }
        else
        {
        
            nr=abs(nr);
            for (l=q*k;l>0;--l)
            {
                if (!a[l]) nr--;
                if (nr==-1) {j=l;break;}
            }}
        }
    }
   
    return 0;
}