题目链接
题目
题目大意
T
T
T 组测试数据
每组
n
n
n 个货物,第
i
i
i 个货物 的重量是
a
i
a_i
ai
用k辆货车按顺序装这些货物,条件是每辆车上的货物个数都一样,也即是说
n
n
n 必须能被
k
k
k 整除,
求任意两辆车货物总重量的最大的差值。
思路
这题直接是暴力枚举,细节见代码
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10;
int a[N], sum[N], back[N];
bool isPrime(int n) {
if (n == 1) return false;
if (n == 2 || n == 3 || n == 5 || n == 7) return true;
//只需判断一个数能否被小于sqrt(n)的奇数整除
for (int i = 2; i <= sqrt(n); i ++) {
if(n % i == 0) {
return false;
}
}
return true;
}
signed main()
{
int T; cin >> T;
while (T -- )
{
int n;
scanf("%lld", &n);
for (int i = 0; i <= n; i ++ ) sum[i] = 0;
for (int i = 1; i <= n; i ++ )
{
scanf("%lld", &a[i]);
back[i] = a[i];
sum[i] = sum[i - 1] + a[i];
}
// 只有一个数时输出0
if (n == 1)
{
cout << 0 << endl;
continue;
}
// for (int i = 1; i <= n; i ++ )
// {
// cout << sum[i] << " ";
// }
// cout << endl;
sort(back + 1, back + 1 + n);
// 如果每个数都一样,直接输出0
int ma = back[n] - back[1];
if (ma == 0)
{
printf("%lld\n", ma);
continue;
}
// 开始枚举每一个
for (int i = 2; i <= n / 2; i ++ )
{
if (n % i == 0)
{
int m1 = 0, m2 = 99999999999999999;
int l = 0, r = i; //双指针进行枚举
// 一共装n/i辆货车
for (int j = 1; j <= n / i; j ++ )
{
// 算出这辆货车的货物重量
int x = sum[r] - sum[l];
// 求最大的重量和最小的重量
m1 = max(x, m1);
m2 = min(x, m2);
// 找下一辆车
l += i;
r += i;
}
// 找最大的差值
ma = max(ma, abs(m1 - m2));
// 算一遍i辆货车时的情况
m1 = 0, m2 = 99999999999999999;
l = 0, r = n / i;
for (int j = 1; j <= i; j ++ )
{
int x = sum[r] - sum[l];
m1 = max(x, m1);
m2 = min(x, m2);
l += (n / i);
r += (n / i);
}
ma = max(ma, abs(m1 - m2));
}
}
printf("%lld\n", ma);
}
return 0;
}