题目:
http://codevs.cn/problem/1959/
无语,随机化竟然能过,看来数据很水(n<=100);
开始我只随机化了十万次,老是WA一个点;
然后我改成了二十二万次,A掉了;
这只是娱乐一下,实际上随机化很不靠谱……;
当然,考场上实在想不出正解用随机化骗分也可以,但要注意时间复杂度;
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<ctime>
using namespace std;
const int MAXN=2001;
int a[MAXN];
int n;
int sum1,sum2,ans1=214214212,ans2;
void rand_()
{
for(int i=1;i<=n;i++)
{
int x=rand()%n+1;//防止0的情况;
while(i==x) x=rand()%n+1;
swap(a[i],a[x]);
}
return;
}
void calc()
{
sum1=0,sum2=0;
for(int i=1;i<=n/2;i++) sum1+=a[i];
for(int i=n/2+1;i<=n;i++) sum2+=a[i];
if(abs(ans1-ans2)>abs(sum1-sum2)) ans1=sum1,ans2=sum2;
}
void solve()
{
srand(time(0));
cin>>n;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=220000;i++) calc(),rand_();//交换22万次;
if(ans1>ans2) swap(ans1,ans2);
cout<<ans1<<" "<<ans2;
}
int main()
{
solve();
return 0;
}