CF1899B 250 Thousand Tons of TNT

3 篇文章 0 订阅

题目链接

题目

在这里插入图片描述在这里插入图片描述

题目大意

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;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值