Code: Select all
#include <stdio.h>
int main(){
int input[7], small[7], big[7], count = 0, sum = 0, small_sum = 0, big_sum = 0,transfer;
bool flag, divided, transfered;
while(true){
count++;
sum = 0, small_sum = 0, big_sum = 0;
flag = true;
for (int i = 1; i<=6; i++){
scanf("%d", &input[i]);
if (input[i]) flag = false;
sum += input[i] * i;
small[i] = 0;
big[i] = 0;
}
if(flag) break;
if (sum % 2 == 1){
printf("Collection #%d:\n", count);
printf("Can't be divided.\n\n");
continue;
}
for (int j = 1; j<=6; j++){
small[j] = big[j] = input[j]/2;
small_sum += small[j] * j;
big_sum += big[j] * j;
if((input[j] % 2) == 1){
small[j]++;
small_sum += j;
}
}
divided = true;
while(small_sum > big_sum){
transfer = (small_sum - big_sum)/2;
if (transfer > 6) transfer = 6;
transfered = false;
for (int i = transfer; i >= 1; i--){
if (transfered) break;
for (int j = 6; j >= i; j--){
if (small[j] > 0){
if ((j - i) == 0){
small[j]--;
small_sum -= j;
big[j]++;
big_sum += j;
transfered = true;
break;
}
else if(big[j - i] > 0){
small[j]--;
small[j - i]++;
small_sum -= i;
big[j]++;
big[j - i]--;
big_sum += i;
transfered = true;
break;
}
}
}
}
if (!transfered){
divided = false;
break;
}
}
printf("Collection #%d:\n", count);
if(divided){
printf("Can be divided.\n\n");
}
else{
printf("Can't be divided.\n\n");
}
}
}
I dont know why got a WA, I tested so many testcase but can't find an error, my method is first divided the marble into 2 part, e.g. {11 11 10 10 11 11} will divided to small:{6 6 5 5 6 6}
and big{ 5 5 5 5 5 5}. Then exchange marbles between 'small' and 'big' until 2 part got equal sum(sum of small part always >= sum of big part) or can't exchange.
I think this method is logically ok but don't why always got WA, can anyone who got find some test case to show my program is wrong pls? I dont know what wrong, I try this question about 2 days but still can't figure it out