P8278 题解
题意
给定元素个数为
思路
思路1:50 分
相信与许多人的思路一样,遍历
但是,这个做法被毙掉了。
思路2:100 分
大家注意看一下题意中被我加粗的那句话。
且对于任意
1 \leq i \leq n ,a_i 不得大于1000
若构造数据使得
因此,我们做到尽量平摊,使用整除的方式将
于是下面的AC代码就呼之欲出了。
#include<bits/stdc++.h>
using namespace std;
int p[100001];
int main()
{
register int t;
scanf("%d",&t);
while(t--)
{
register int n;
register int mult=0;
register int chuli=0;
scanf("%d",&n);
for(register int i=1;i<=n;i++)scanf("%d",&p[i]);
for(register int i=1;i<=n;i++)
{
mult++; //变量mult用于记录分配区间长度
if(p[i]!=-1)
{
p[i]-=chuli;
chuli+=p[i];
register int tmp=p[i];
for(register int j=0;j<mult-1;j++)
{
printf("%d ",p[i]/mult); //将p[i]平摊到分配区间中
tmp-=p[i]/mult;
}
printf("%d ",tmp);
mult=0;
}
}
for(register int j=0;j<mult;j++)
{
printf("1 "); //p数组末尾仍有-1,一律输出1
}
}
return 0;
}