Cod sursa(job #3269)

Utilizator gigi_becaliGigi Becali gigi_becali Data 23 decembrie 2006 07:56:24
Problema Jocul Flip Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#include <deque>
#include <multiset.h>
#include <set>
#define maxn 10001
#define maxk 51
using namespace std;

int n, k;
int x[maxn*maxk], y[maxn*maxk], T;
struct nod{ int n, w;};

struct cmp{
	bool operator()(const nod &a, const nod &b) const
	{
		if(a.w>b.w) return 1;
		if(a.w==b.w) if(a.n<b.n) return 1;
		return 0;
	}
};

multiset<nod, cmp> Q;
multiset<nod, cmp>::iterator it, iit;




void citire()
{
	freopen("kreg.in", "r", stdin);
	scanf("%d %d\n", &k, &n);
}

void calcul()
{
	int i,j;
	
	nod t, u;
	t.w=k;
	for(i=1;i<=n;i++)
	{
		t.n=i;
		Q.insert(t);
	}
	

	for(i=1;i<=n;i++)
	{
		t=*Q.begin();
		Q.erase(t);
		
		deque<nod> R;
		
		for(j=1, it=Q.begin();j<=t.w && it!=Q.end();j++, it++)
		{
			++T;
			x[T]=t.n;
			y[T]=it->n;
			R.push_back(*it);
			iit=it;
		}
		for(j=0;j<t.w;j++) Q.erase(R[j]);
		for(j=0;j<t.w;j++) R[j].w--;
		for(j=0;j<t.w;j++) Q.insert(R[j]);
	}
}

int main()
{
	//citire();
	n=9234;
	k=50;
	calcul();
	freopen("flip.out", "w", stdout);
	for(int i=1;i<=T;i++) printf("%d %d\n",x[i], y[i]); 
	
	return 0;
}