1741C - Minimize the Thickness
作者:
MangoCat
,
2022-10-19 00:40:54
,
所有人可见
,
阅读 125
题目思路: 遍历区间长度,然后根据区间长度和 遍历时候存在答案然后记录最长的区间
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 2010;
int nums[N];
int n;
int go(int i , int sum){
// 表示已经找完了一次答案
if(i == n) return 0;
// 55 45 30 30 40 100
for(int j = i + 1 , cur = 0 ; j <= n ; j++){
cur += nums[j-1];
// 不符合条件直接返回 数组长度
if(cur > sum) return n;
// 因为j -> i+1开始 两者的距离 是j-i
if(cur == sum ) return max(j-i,go(j , cur));
}
return n;
}
int solve(){
// 默认为整个数组长度
int ans = n;
// 遍历可能存在的长度
for(int len = 1 , sum = 0 ; len < n ; len++){
sum += nums[len-1];
// 确定sum 后 遍历最后可能[l,r] 的和 == sum 的最长情况
// 需要跟 ans取最小值 存在多种情况 划分的情况不一样
ans = min(ans , go(0 , sum));
}
return ans;
}
int main(){
int T;
cin >> T;
while(T--){
cin >> n;
//读入整个数组
for(int i = 0 ; i < n ; i++) cin >> nums[i];
cout << solve() << endl;
}
return 0;
}