题
有
n
n
n 堆石头,第
i
i
i 堆有
a
i
a_i
ai 个,一开始你有 1 次操作机会,0 点分数。
你可以选其中任意一堆石头进行操作,消耗 1 次操作机会,操作按以下顺序进行:(设对第
i
i
i 个位置进行操作)
- 将 [ m a x ( 1 , i − a i ) , i − 1 ] [max(1,i-a_i),i-1] [max(1,i−ai),i−1] 范围内的石头个数 +1.
- 分数 +1,如果 a i = i a_i = i ai=i ,操作数 +1.
- 将第 i i i 堆石头个数清零。
求能得到的最大分数是多少。
解
直接看代码吧…考场sb写挂了。
#include <bits/stdc++.h>
using namespace std;
#define R register
int n,num[2000005];
long long ans=0ll;
int main()
{
scanf("%d",&n);R bool ad=0;
for (R int i=1;i<=n;++i)scanf("%d",&num[i]);
for (R int i=n,x;i>=1;--i)num[i]<=i?x=ans,ans+=(ans+num[i])/i,num[i]=((x+num[i])%i):0,ad|=num[i];
printf("%lld\n",ans+ad);
return 0;
}