Cod sursa(job #613510)

Utilizator thelasMatei Vlad thelas Data 28 septembrie 2011 18:01:12
Problema Grupuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<cstdio>
#include<fstream>
using namespace std;
int n,a[100],k;
int grup(int a[100],int p,int n)
{
	int i;
	for (i=n;i>=n-k;--i)
	{
		a[i]=a[i]-1;
	}
	return p+1;
}	
void test(int n)
{int i;
for(i=1;i<=n;++i)
	printf("%d",a[i]);
}
int ordonat(int li,int ls)
{
	int m;
	m=(li+ls)/2;
	if (ls==li)
		return 1;
	else
	{
		int ok1=ordonat(li,m);
		int ok2=ordonat(m+1,ls);
		if (ok1==1&&ok2==1&&a[m]<=a[m+1])
			return 1;
		else
			return 0;
	}}
	void stergere(int i)
	{int j;
		for(j=i+1;j<=n;++j)
			a[j-1]=a[j];
		--n;
	}
	int pozitie(int li,int ls,int x)
	{
		int m;
		m=(li+ls)/2;
		if (li==ls)
			if(x<=a[li])
				return li;
			else 
				return li+1;
			else
			{
				if(a[m]>x)
					return pozitie(li,m,x);
					else
						return pozitie(m+1,ls,x);
			}
	}
	void inserare(int x,int li,int&n)
	{
		int i;
		for (i=n;i>=li;--i)
			a[i+1]=a[i];
		a[li]=x;
		++n;
	}
	int d(int n)
	{
		int i=1;
		while(a[i]<=a[i+1])
		{
			++i;
		}
		return i;
	}
		
			
		
int main()
{
	int i,k,n,a[100],x;
    int p=0;
    FILE* f=fopen("grupuri.in","r");
    FILE* g=fopen("grupuri.out","w");
    fscanf(f,"%d%d",&k,&n);
    for(i=1;i<=n;++i)
	   fscanf(f,"%d",&a[i]);
	p=grup(a,0,n);
	test(n);
	while(n>=k)
    {test(n);
	if (ordonat(1,n)==1)
		p=grup(a,p,n);
	else
	{
		int h=d(n);
		int x=a[h];
		stergere(h);
		 int r =pozitie(1,n,x);
		 inserare (x,r,n);
	}
	for(i=n;i>=1;--i)
		if(a[i]==0)
			stergere(i);
}
		
		fprintf(g,"%d",p);
		fclose(f);
		fclose(g);
}