玄学AC
查看原帖
玄学AC
253340
fxxxysh楼主2021/12/21 16:05
#include <iostream>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <unistd.h>
#include <algorithm>

using namespace std;

inline int read()
{
    int x = 0, f = 1; char ch = getchar();
    while(ch < '0' || ch > '9')
    { if(ch == '-') f = -1; ch = getchar(); }
    while(ch >= '0' && ch <= '9')
    { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); }
    return x * f;
}

typedef long long ll;
const int N = 10005;
ll n, a[N], a0[N], b[N], b0[N], p[N], ans;

inline void upd()
{
    for(int i = 0; i < n - 1; ++i)
        a[i + 1] = a[i] + b[i];
}

inline ll getval()
{
    ll sum = 0, sqrsum = 0;
    for(int i = 0; i < n; ++i)
        sum += a[i], sqrsum += a[i]*a[i];
    return n * sqrsum - sum * sum;
}

void random_shuffle(void)
{
	for(int i = 0;i < n-1;i ++)
	{
		swap(b0[i],b0[rand()%(n-1)]);
	}
}

int main()
{
    srand(time(0));
    for(int i = 0;i < 100;i ++)srand(rand()+rand());
    n = read();
	a[0] = read();
    for(int i = 1; i < n; ++i)
		a[i] = read(), b[i - 1] = b0[i - 1] = a[i] - a[i - 1];
    ans = getval();
    clock_t start = clock();
    while(double(clock() - start) / CLOCKS_PER_SEC < 0.04)
    {
    	random_shuffle();
    	for(int i = 0;i < n - 1;++i)b[i]=b0[i];
    	sort(b, b + n - 1);
    	for(int i = 0; i < n - 1; ++i)
	    {
	    	if(!b0[i]) continue;
	    	for(int j = n - 2;j >= i;-- j)
	    	{
	    		if(b[j]==b0[i])
	    		{
	    			for(int k = j;k > i;-- k)b[k]=b[k-1];
	    			break;
				}
			}
	    	for(int j = 0;j <= i;j ++)
	    	{
	    		if(b[j]<b0[i])
	    		{
	    			for(int k = i;k > j;k --)b[k]=b[k-1];
	    			b[j]=b0[i];
	    			break;
				}
			}
	    	upd();
	    	ans = min(ans, getval());
		}
    }
    printf("%lld", ans);
    return 0;
}

总时长能进1s

2021/12/21 16:05
加载中...