A - >< again[AtCoder Grand Contest 053]

分析:首先一猜就是 \(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;
}
posted @ 2021-07-27 15:35  GUO_dx  阅读(56)  评论(0编辑  收藏  举报