Advertisement

UVa 714 获取书籍(Obtaining Books)

阅读量:

题意:
将一个由m个正整数构成的序列分割为k个非空的子序列,确保每个正整数仅归属于一个子序列。设第i个子序列中所有数值的总和为S(i),目标是使所有S(i)中的最大值尽可能小。

分析:
首先,由于k的数值较大,因此无法通过暴力方法进行穷举。可以考虑采用二分法,其时间复杂度为logM,其中M表示所有m个数的总和。此外,在判断当前设定值是否合适时,需要遍历所有数值,这需要O(n)的时间复杂度。综上所述,整体的时间复杂度为O(nlogM)。

难点:
二分法本身并不困难,但本题的关键在于如何安排数值分布——要求前面的数值尽量小,而后面的尽量大。因此,在处理过程中应从后往前采用贪心策略,并确保每次尽可能接近最大值。此外,在处理斜杠存储的问题上也存在一定的难度。同时还需要特别注意当剩余未分配的数值数量与已划分出的斜杠数量相等时的情况。总体而言,本题涉及诸多需要注意的细节。

代码:

复制代码
    #include<bits/stdc++.h>
    #define LL long long
    #define ms(s) memset(s, 0, sizeof(s))
    using namespace std;
    int n, k;
    const int maxn = 5e2 + 10;
    int a[maxn];
    //10000000

全部评论 (0)

还没有任何评论哟~