2 条题解
-
0
#include <bits/stdc++.h> using namespace std; int s[510], f[510][510]; void print(int n, int k, int ans) { if(k == 0) return ; if(n == 0) {printf("0 0\n");return ;} for(int i = n; i >= 0; i--) { if(s[n] - s[i - 1] > ans || i == 0) { print(i, k - 1, ans); printf("%d %d\n", i + 1, n); return ; } } } int main() { int n, k;scanf("%d%d", &n, &k); memset(f, 63, sizeof(f)); for(int i = 0; i <= k; i++)f[0][i] = 0; s[0] = 0;for(int i = 1, x; i <= n; i++){ scanf("%d", &x);s[i] = s[i - 1] + x;f[i][1] = s[i];} for(int ki = 2; ki <= k; ki++) for(int i = ki; i <= n; i++) { for(int j = i - 1; j >= 0; j--) { f[i][ki] = min(f[i][ki], max(f[j][ki - 1], s[i] - s[j])); } } print(n, k, f[n][k]); return 0; } -
0
#include<bits/stdc++.h> using namespace std; int s[510],f[510][510]; void print(int n,int k,int ans) { if(k==0) return ; if(n==0) {printf("0 0\n");return ;} for(int i=n;i>=0;i--) { if(s[n]-s[i-1]>ans|| i==0) { print(i,k-1,ans); printf("%d %d\n",i+1,n); return ; } } } int main() { int n,k;scanf("%d%d",&n,&k); memset(f,63,sizeof(f)); for(int i=0;i<=k;i++)f[0][i]=0; s[0]=0;for(int i=1,x;i<=n;i++){ scanf("%d",&x);s[i]=s[i-1]+x;f[i][1]=s[i];} for(int ki=2;ki<=k;ki++) for(int i=ki;i<=n;i++) { for(int j=i-1;j>=0;j--) { f[i][ki]=min(f[i][ki],max(f[j][ki-1],s[i]-s[j])); } } print(n,k,f[n][k]); return 0; }
- 1
信息
- ID
- 1892
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 26
- 已通过
- 14
- 上传者