| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
为什么哇了?In Reply To:先排序,然后把每次最小的和最大的分到一组,然后随机交换 Posted by:JiangLY at 2005-08-16 09:43:04 #include <iostream>
#include <stdlib.h>
#include <cmath>
#include <algorithm>
using namespace std;
int A[100], B[50], C[50];
int bn, cn, bs, cs, n;
int i, j;
void pt(){
puts("");
for(i=0; i<n; i++)
cout<<A[i]<<' ';
puts("");
for(i=0; i<bn; i++)
cout<<B[i]<<' ';
puts("");
for(i=0; i<cn; i++)
cout<<C[i]<<' ';
}
void main()
{
cin>>n;
for(i=n-1; i>=0; i--)
scanf("%d", A+i);
sort(&A[0], &A[n]);
bn = n /2;
cn = n - bn;
int ft=0, bk=n-1;
for(bs=0, i=bn-1; i>=0; i--)
{
if(i&1)
B[i]=A[bk--];
else
B[i]=A[ft++];
bs += B[i];
}
// printf("%d %d\n", cn, bk-ft+1);
for(i=cn-1; i>=0; i--){
C[i]=A[ft+i];
cs += C[i];
}
for(int t=0;t<1000000;++t)
{
i = rand()%bn;
j = rand()%cn;
int d1 = abs(bs-cs);
int d2 = abs(bs-cs-((B[i]-C[j])<<1));
if(d1 >= d2)
{
bs -= B[i] - C[j];
cs -= C[j] - B[i];
swap(B[i], C[j]);
}
}
if(bs>cs) swap(bs, cs);
cout<<bs<<" "<<cs;
pt();
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator