Page 25 of 33

Reply

Posted: Sun Jun 18, 2006 4:05 am
by Fali
Hi!! :D

Let me explain the sample input...

Sample Input

1 2 3 4 5 6 7 8 9

then the bins are in this form:
Brown Green Clear
Bin #1: 1 2 3
Bin #2: 4 5 6
Bin #3: 7 8 9

We want to put all the brown bottles in one bin, all the green bottles in other and all the clear bottles in other. i.e we want to separe the bins by color.

if we try the following order:

BCG

then we have to move 4 brown bottles of bin#2 and 7 brown bottles of bin#3 to bin#1, because bin#1 is of brown bottles, of de same form we have to move 3 clear bottles from bin#1 and 9 clear bottles from bin#3 to bin#2 and 2 green bottles from bin#1 and 5 green bottles from bin#2 to bin#3, then the total of moved bottles is:

4 + 7 + 3 + 9 + 2 + 5 = 30.

I hope this help :lol:

P.D. There are only 6 possible combinations:

BCG
BGC
CBG
CGB
GBC
GCB

you can only figure out those 6 (yes, only 6) possible combinations, and then choose the smallest.

Posted: Sun Jun 18, 2006 2:18 pm
by sathyashrayan
yes, I have got the Idea. Several thanks for delighting in this.

A little program about 102

Posted: Sun Jul 30, 2006 10:45 am
by toyman

Code: Select all

while(cin>>arr[0]>>arr[1]>>arr[2]>>arr[3]>>arr[4]>>arr[5]>>arr[6]>>arr[7]>>arr[8]){ 
can this work?
I can get AC!!!
Code:

while (true) {
if (cin.eof()) break;

This is the cause of WA.
This should be changed,
Code:
while (scanf("%d %d %d %d %d %d %d %d %d",
&data[0],&data[1],&data[2],
&data[3],&data[4],&data[5],
&data[6],&data[7],&data[8])==9) {...
the above means what???
that's will got WA??

Posted: Mon Jul 31, 2006 7:31 am
by smilitude
this is supposed to work!
i took my input like this ...

Code: Select all

while(scanf("%d%d%d%d%d%d%d%d%d", 
&b[0][0],&b[0][2],&b[0][1],&b[1][0],&b[1][2],&b[1][1],&b[2][0],&b[2][2],&b[2][1])==9)

102, WA. Help me.

Posted: Wed Aug 09, 2006 5:04 pm
by mosaick2
I don't know what's problem in my code.
Who can advice me?
(Actually, I have passed many testcase that I found below threads.)
I'll appreciate your help.
------------------------------------------------------------------------------
I got A.C
Actually, My mistake is if-statement's position.

Code: Select all

 *wrong code*

	do
	{ 
		if (cin.eof()) break;  <=====
		bp.SetInput();
		bp.GetSolution();
	} while (!cin.eof());

Code: Select all

*correct code*

	do
	{ 
		bp.SetInput();
		if (cin.eof()) break; <=====
		bp.GetSolution();
	} while (!cin.eof());

In wrong code, my program prints one more line that comes from last answer.

Thankx, shaform : )

Posted: Sat Aug 12, 2006 6:07 am
by shaform
Your program prints an unnecessary line when End-Of-File is reached.
( cin.eof() returns true if the eofbit stream's error flag has been set by a previous i/o operation. )
Why not just write something like this:

Code: Select all

z = 0;
while(cin >> x[z]) {
	if(++z<9) continue;

This problem can be solved without using arrays

Posted: Sun Aug 20, 2006 1:09 pm
by hedgehog1204
just linear programming and single data types. Here is the example in Python (easy to convert to other languages):

Code: Select all

# Program that solves the Ecological Bin Packing problem
# http://acm.uva.es/p/v1/102.html
	
file = open('input.txt')
for line in file:
	vars = line.strip().split(' ')				# get numbers from input file
	B1, G1, C1, B2, G2, C2, B3, G3, C3 = vars	# assign number of bottles in bins
	# count number of moves for every bin and color:
	B12, B13, B23 = int(B1)+int(B2), int(B1)+int(B3), int(B2)+int(B3)		
	C12, C13, C23 = int(C1)+int(C2), int(C1)+int(C3), int(C2)+int(C3)
	G12, G13, G23 = int(G1)+int(G2), int(G1)+int(G3), int(G2)+int(G3)
	min = B23+G12+C13
	minBins = "BGC"

	# find minimum number of moves
	moves = B23+G13+C12
	if moves < min or minBins > "BGC" and min == moves:
		minBins, min = "BGC", moves
	moves = B23+G12+C13
	if moves < min or minBins > "BCG" and min == moves:
		minBins, min = "BCG", moves
	moves = B13+G23+C12
	if moves < min or minBins > "GBC" and min == moves:
		minBins, min = "GBC", moves
	moves = B12+G23+C13	
	if moves < min or minBins > "GCB" and min == moves:
		minBins, min = "GCB", moves
	moves = B13+G12+C23
	if moves < min or minBins > "CBG" and min == moves:
		minBins, min = "CBG", moves
	moves = B12+G13+C23
	if moves < min or minBins > "CGB" and min == moves:
		minBins, min = "CGB", moves
	print minBins, min
file.close()



102 wa ? please

Posted: Fri Sep 01, 2006 7:59 am
by tle_nu
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("bin.txt");

int main()
{
int sum,pack;
int min = 0;

int bin[10];

while(fin >> bin[1] >> bin[2] >> bin[3] >> bin[4] >> bin[5] >> bin[6] >> bin[7] >> bin[8] >> bin[9])
{


min = bin[2]+bin[3]+bin[4]+bin[5]+bin[7]+bin[9];
pack = 2;

if((sum = bin[2]+bin[3]+bin[4]+bin[6]+bin[7]+bin[8]) < min)
{
min = sum;
pack = 1;
}

if((sum = bin[2]+bin[3]+bin[4]+bin[5]+bin[7]+bin[9]) < min)
{
min = sum;
pack = 2;
}

if((sum = bin[1]+bin[3]+bin[5]+bin[6]+bin[7]+bin[8]) < min)
{
min = sum;
pack = 3;
}

if((sum = bin[1]+bin[3]+bin[4]+bin[5]+bin[8]+bin[9]) < min)
{
min = sum;
pack = 4;
}

if((sum = bin[1]+bin[2]+bin[5]+bin[6]+bin[7]+bin[9]) < min)
{
min = sum;
pack = 5;
}

if((sum = bin[1]+bin[2]+bin[4]+bin[6]+bin[8]+bin[9]) < min)
{
min = sum;
pack = 6;
}

switch(pack)
{
case 1 :
cout << "BGC " << min << endl;
break;
case 2 :
cout << "BCG " << min << endl;
break;
case 3 :
cout << "GBC " << min << endl;
break;
case 4 :
cout << "GCB " << min << endl;
break;
case 5 :
cout << "CBG " << min << endl;
break;
case 6 :
cout << "CGB " << min << endl;
break;
}
}

return 0;
}

Posted: Fri Sep 01, 2006 4:45 pm
by Vexorian
there aren't much test cases that might fail here except when more than one combination is the minimum in which case the output should be the alphabetically first minimum solution.

try these test cases:

in

Code: Select all

2 2 2 2 2 2 2 2 2
10 90 16 78 1 2 3 100 1000
0 0 0 0 0 0 0 0 0
1 3 3 5 3 3 9 3 3
out

Code: Select all

BCG 12
GBC 132
BCG 0
CGB 18

102 Wrong Answer

Posted: Fri Sep 01, 2006 6:43 pm
by neo_darko
Hi - I've tried the available Test Cases - the outputs seem to be correct. But still I got wrong answer...

Code: Select all


# include <stdio.h>
# include <string.h>

long a[6];
long bin1[4];
long bin2[4];
long bin3[4];

char *ch[6] = { "BCG", "BGC", "CBG", "CGB", "GBC", "GCB" };

int main()
{	
	long min, index;
	
	while( scanf("%ld%ld%ld%ld%ld%ld%ld%ld%ld", &bin1[1], &bin1[2], &bin1[3], &bin2[1], &bin2[2], &bin2[3], &bin3[1], &bin3[2], &bin3[3]) != EOF )
	{
		min = 999999;
		
		a[0] =  bin2[1] + bin3[1] + bin1[3] + bin3[3] + bin1[2] + bin2[2];
		if ( min > a[0] ) 
		{
			min = a[0];
			index = 0;
		}
				
		a[1] =  bin2[1] + bin3[1] + bin1[2] + bin3[2] + bin1[3] + bin2[3];
		if ( min > a[1] ) 
		{
			min = a[1];
			index = 1;
		}
		
		a[2] =  bin2[3] + bin3[3] + bin1[1] + bin3[1] + bin1[2] + bin2[2];
		if ( min > a[2] ) 
		{
			min = a[2];
			index = 2;
		}
		
		a[3] =  bin2[3] + bin3[3] + bin1[2] + bin3[2] + bin1[1] + bin2[1];
		if ( min > a[3] ) 
		{
			min = a[3];
			index = 3;
		}
		
		a[4] =  bin2[2] + bin3[2] + bin1[1] + bin3[1] + bin1[3] + bin2[3];
		if ( min > a[4] ) 
		{
			min = a[4];
			index = 4;
		}

		a[5] =  bin2[2] + bin3[2] + bin1[3] + bin3[3] + bin1[1] + bin2[1];
		if ( min > a[5] ) 
		{
			min = a[5];
			index = 5;
		}
		
		printf("%s %ld\n", ch[index], a[index]);
	}
	
	return 0;
}

Posted: Fri Sep 01, 2006 6:53 pm
by Vexorian
there was a topic on this problem just 2 threads bellow but anyways try these:

in:

Code: Select all

2 2 2 2 2 2 2 2 2
10 90 16 78 1 2 3 100 1000
0 0 0 0 0 0 0 0 0
1 3 3 5 3 3 9 3 3
out:

Code: Select all

BCG 12
GBC 132
BCG 0
CGB 18

Posted: Fri Sep 01, 2006 7:41 pm
by neo_darko
Sorry for opening a new thread - but I thought that's how things go around here - I mean everyone should start his/her own thread...

Anyways - I've tried the test cases - they worked...

:)

Posted: Sat Sep 02, 2006 3:23 am
by tan_Yui
The total number of bottles will never exceed 2^31.
So, the parameter 'min = 999999;' will be too small to solve.
It should be set on more than 2147483648. :wink:

Best regards.

Posted: Sat Sep 02, 2006 7:26 am
by chunyi81
Why are you reading from a file? You should be reading input using cin or scanf for C++ code.

Posted: Sat Sep 02, 2006 1:17 pm
by neo_darko
Hey - thanks...

Changed everything to long long and the value of min as you said...Got accepted...

Thanks.. :D