蒟蒻,外站题求调
  • 板块题目总版
  • 楼主lihaoda
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/6 15:41
  • 上次更新2024/7/6 17:11:29
查看原帖
蒟蒻,外站题求调
1024914
lihaoda楼主2024/7/6 15:41

题目题目
对于给定的一个长度为 N 的正整数数列 A[i] ,现要将其分成 M 段,并要求每段连续,且每段和的最大值最小。

关于最大值最小:

例如一数列 4 , 2 , 4 , 5 , 1 3 段

将其如下分段:[42],[45],[1]

第一段和为 6,第二段和为 9,第三段和为 1,和最大值为 9。

将其如下分段:

[4],[24],[51]

第一段和为 4 4,第二段和为 6 6,第三段和为 6 6,和最大值为 6 6。

并且无论如何分段,最大值不会小于 6 6。

所以可以得到要将数列 4 , 2 , 4 , 5 , 1 4,2,4,5,1 要分成 3 3 段,每段和的最大值最小为 6 6。

输入格式
第一行包含两个正整数 N,M。

第二行包含 N 个空格隔开的正整数 A [i],含义如题目所述。

输出格式
一个正整数,即每段和最大值最小为多少。

呆码

#include<bits/stdc++.h>

using namespace std;

long long n,a[999999],t;

bool check(long long x){
//	int cnt = 0;
//	int sum = 0;
//	int tmp = 1;
//	while(tmp<=n){
//		while(cnt+a[++tmp]<=x)cnt+=a[tmp];
//		cnt=0,sum++;
//	}
//	return sum == t;
}

int main(){
	cin >> n >> t;
	for(long long i=1;i<=n;++i){
		cin >> a[i];
	}
//	sort(a+1,a+n+1);
	long long l = 1,r=1e9,mid = 0,pos = 0;
	while(l<=r){
		mid= (r+l)/2;
//		cout << mid << endl;
//		r = mid-1;
		if(check(mid)){
			l = mid+1;
			pos = mid;
		}
		else{
			r = mid-1;
		}
	}
	cout << pos+1;
	return 0;
}
/*
class rule{
	1.please WA!
	2.don't TLE!
	3.don't MLE!
	4.don't CE!
	5.don't RE!
	6.don't UKE!
	7.please AC!!!!!!
}
*/
2024/7/6 15:41
加载中...