Cod sursa(job #493559)

Utilizator ConsstantinTabacu Raul Consstantin Data 18 octombrie 2010 18:17:59
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
queue<int>q1,q2;

int a[ 1<<18 ][ 19 ],P,g[ 18 ],G,i,j,k,l,m,n;

void solve(){
memset(a,0,sizeof(a));
while(!q1.empty())
	{q1.pop();
	q2.pop();
	}
P=0;


for(i = 0 ; i < n ; i++)
	{a[1<<i][1] = g[i+1];
	P++;
	q1.push(1<<i);
	q2.push(1);
	}
int x,y,I,J,val;

while(P){
x = q1.front();
y = q2.front();
for(i = 0; i < n ; i++)
	if(!(1&(x>>i)))
		{I = x + (1<<i);
		val = a[x][y] + g[i+1];
		if(val > G)
			{J = y+1;
			val = g[i+1];
			}
		else
			J = y;
		if(!a[I][J])
			{a[I][J] = val;
			P++;
			q1.push(I);
			q2.push(J);
			}
		else
		if(a[I][J] > val)
			a[I][J] = val;			
		}
		
P--;
q1.pop();
q2.pop();
}


}

void afis(){
int i,N;
N = (1<<n)-1;
for(i = 1 ; i <= n ; i++)
	if(a[N][i]){
		printf("%d\n",i);
		return;
	}
}
void citire(){
int i;

freopen("zebughil.out","w",stdout);

freopen("zebughil.in","r",stdin);

scanf("%d %d",&n,&G);
for(i = 1 ; i <= n ; i++)
	scanf("%d",&g[i]);
solve();
afis();

scanf("%d %d",&n,&G);
for(i = 1 ; i <= n ; i++)
	scanf("%d",&g[i]);
solve();
afis();

scanf("%d %d",&n,&G);
for(i = 1 ; i <= n ; i++)
	scanf("%d",&g[i]);
solve();
afis();

}

int main(){
citire();
return 0;}