CF Global Round 10-F

F.Omkar and Landslide

\(Description:\)

\(n\)一堆石子,每堆高度为\(a_i\)\(a_i\)严格递增,如果某一时刻\(a_i\le a_{i+1}-2\),则下一时刻\(a_i\)的高度\(+1\)\(a_{i+1}\)的高度\(-1\)

问最后稳定的状态

\(Solution:\)

有两个结论:

  1. 显然在最后的稳定状态中,高度是递增的(非严格递增)
  2. 连续的相等的高度不会超过两个

前者很显然

关于后者,做一个简单解释,连续相等的高度超过两个的话就找不到它的上一个状态了,也就是说石子落下来之前的状态都是不合法的。不信的话可以自己把前面的石子往后丢。

那么有这两个条件,在结合原序列是严格递增的,可以推出最后的形态只与石子的总高度有关,再稍微推一下就可以找规律输出了

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
typedef long long lol;
lol n,x,sum;
lol read(){
	lol ans=0,f=1;char i=getchar();
	while(i<'0'||i>'9'){if(i=='-')f=-1;i=getchar();}
	while(i>='0'&&i<='9'){ans=ans*10+i-'0';i=getchar();}
	return ans*f;
}
void write(lol x){
	if(x<0){putchar('-');x=-x;}
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
int main(){
	n=read();
	for(int i=1;i<=n;i++)x=read(),sum+=x;
	sum-=n*(n-1)/2;
	lol ave=sum/n,rest=sum%n;
	for(int i=1;i<=n;i++){
		write(i-1+ave+(i<=rest));
		putchar(' ');
	}
	puts("");
	return 0;
}
posted @ 2020-08-17 16:45  kakakakakaka  阅读(175)  评论(0编辑  收藏  举报

Never forget why you start

//鼠标爆炸特效