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;
}