A

分析:首先一猜就是 (K=min{A[i]-A[i-1]}),验证就是后面的差Bk(i)-Bk(i-1)最多是1,然后加起来就是k。

先平均分k组.
再考虑剩下的怎么分。
先关心差为k的那对数。
a/k和(a+k)/k相差1
a%k 和(a+k)%k其实是相等的,也就意味着多出来的1会分给同一组,就不会出现本来是1 2,加完1变成2 2的情况了

如果差大于k,那么首先它们平均分完会相差至少1,
然后,如果他们相差为1,那么(a+k+m)%k会大于(a)%k,如果相差更多,那么加1也不影响大小关系了.

code

#include <cstdio>
#include <algorithm>
#include <cmath> 
#include <cstring> 
#include <iostream> 
#define MAXN 10005  


using namespace std;

int n, minn, ans=1e9, a[MAXN], b[MAXN], c[MAXN];


int main()
{

char s[MAXN];
    scanf("%d%s", &n,s+1); 
    for(int i=0; i<=n; ++i) {
        scanf("%d", &a[i]);
        if(i) 
          ans=min(ans, abs(a[i]-a[i-1]));
    }
   cout<<ans<<endl;
    for(int i=0; i<ans; ++i) {
        for(int j=0; j<=n; ++j) {
            if(i<a[j]%ans) printf("%d ", a[j]/ans+1);
            else printf("%d ", a[j]/ans);
        }
        cout<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/GUOGaby/p/15066184.html