【模拟】最少移动

D e s c r i p t i o n Description Description

I n p u t Input Input

O u t p u t Output Output

S a m p l e Sample Sample I n p u t Input Input
3
3
1 3 2
3
2 2 3
5
1 2 3 1 3
S a m p l e Sample Sample O u t p u t Output Output
1
-1
3

H i n t Hint Hint

T r a i n Train Train o f of of T h o u g h t Thought Thought

直接找到平均数,然后一个个加/减

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long 
using namespace std;

ll n, T, Sum, num, Ans;
ll A[200250];

int main()
{
    
    
	scanf("%lld", &T);
	while(T--)
	{
    
    
		memset(A, 0, sizeof(A));
		Sum = num = Ans = 0;
		scanf("%lld", &n);
		for(int i = 1; i <= n; ++i)
			scanf("%lld", &A[i]), Sum += A[i];
		int num = Sum / n;
		if(Sum != num * n)
		{
    
    
			printf("-1\n");
			continue;
		}
		for(int i = 1; i < n; ++i)
		{
    
    
			if(A[i] < num)
			{
    
    
				A[i + 1] -= num - A[i];
				Ans += num - A[i];
				A[i] = num;
			}
			if(A[i] > num)
			{
    
    
				A[i + 1] += A[i] - num;
				Ans += A[i] - num;
				A[i] = num;
			}
		}
		if(A[n] != num)
		{
    
    
			printf("-1\n");
			continue;
		}
		printf("%lld\n", Ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/SSL_wujiajie/article/details/109431035