思维题,模拟
动手模拟一下可以发现,出现的序列是有周期性的,
而且周期数就是n + (n - 1) + (n - 1) = 3n - 2
也就是第二次到达最右边时,出现重复序列
那么在之前各个位置的最大值就已经出现了
模拟计数和移动,顺便比较最大值即可
#include<cstdio>
const int N = 1e4 + 10;
int n;
int a[N],ans[N];
int main(){
scanf("%d",&n);
for(int i = 0; i < n; ++i) a[i] = 1;
int idx = 0;
bool flag = false;
for(int i = 0; i < 3 * n - 2; ++i){
//每个位置的极值也就是在它变为0的前一个数
if(a[idx] > ans[idx]) ans[idx] = a[idx];
a[idx] = 0;
//走到最左边和最右边时,调头
if(idx == 0 || idx == n - 1) flag = !flag;
if(flag) idx++;
else idx--;
//模拟计数
for(int j = 0; j < n; ++j) a[j]++;
}
for(int i = 0; i < n; ++i) printf("%d\n",ans[i]);
return 0;
}
很多时候我们并不能那么帅直接想到公式(就没想出过
那不妨模拟一下找找规律