감 ¶
2005/02/19 Accepted 0:00.002 64
. 경 고 그 .
. 경 고 그 .
¶
~cpp
// no10032 - Tug of War
#include <iostream>
#include <cstdlib>
using namespace std;
struct TugWar
{
int left;
int right;
};
const int MAX_CASE = 100;
const int MAX = 100;
inline void eatline() { while(cin.get() != '\n') continue; };
inline int comp(const void *i,const void *j) { return *(int *)i-*(int *)j; };
int main()
{
int nCase;
int weight[MAX];
int left[MAX/2];
int right[MAX/2];
int nPeople;
cin >> nCase;
TugWar tugwar[MAX_CASE];
int i, j, k;
int sumleft, sumright;
int lcount, rcount;
int tempSwap;
for (i=0; i<nCase; i++)
{
eatline();
eatline();
cin >> nPeople;
for (j=0; j<nPeople; j++)
{
cin >> weight[j];
}
qsort(weight, nPeople, sizeof(int), comp);
sumleft = sumright = 0;
lcount = rcount = 0;
for (j=nPeople-1; j>=0; j--)
{
if (sumleft <= sumright)
{
left[lcount++] = weight[j];
sumleft += weight[j];
if (j != 0)
{
right[rcount++] = weight[j-1];
sumright += weight[j-1];
j--;
}
}
else
{
right[rcount++] = weight[j];
sumright += weight[j];
if (j != 0)
{
left[lcount++] = weight[j-1];
sumleft += weight[j-1];
j--;
}
}
}
int gap = sumleft - sumright;
if (gap == 0)
{
tugwar[i].left = sumleft;
tugwar[i].right = sumright;
continue;
}
for (j=0; j<lcount; j++)
{
for (k=0; k<rcount; k++)
{
if (gap < 0) //
{
if (abs(gap) > abs(abs(gap) - (2 * (right[k] - left[j]))))
{
sumleft += right[k] - left[j];
sumright -= right[k] - left[j];
tempSwap = left[j];
left[j] = right[k];
right[k] = tempSwap;
gap = sumleft - sumright;
break;
}
}
else // 거
{
if (gap > abs(gap - (2 * (left[j] - right[k]))))
{
sumleft -= left[j] - right[k];
sumright += left[j] - right[k];
tempSwap = left[j];
left[j] = right[k];
right[k] = tempSwap;
gap = sumleft - sumright;
break;
}
}
}
}
if (sumleft > sumright)
{
tempSwap = sumleft;
sumleft = sumright;
sumright = tempSwap;
}
tugwar[i].left = sumleft;
tugwar[i].right = sumright;
}
for (i=0; i<nCase; i++)
{
cout << tugwar[i].left << " " << tugwar[i].right << endl;
if (i != nCase - 1)
cout << endl;
}
return 0;
}










