题面

整体的思路就是在均摊每个宿舍的人数,注意一个人可以跑好几次=。=

可以发现多的学生往中间跑一定能跑过宿管,所以只考虑学生们能不能及时跑到人不够的宿舍。对两边记录两个已经满足要求的宿舍,然后用前/后缀和判断这个宿舍是否能达到要求。如果不可能达不到就让他们都跑出来(雾,反正宿管看的是宿舍数目,没人也只损失一个宿舍。最后没出去的那些学生躲在中间的一个/两个宿舍里即可。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
long long fsum[N];
long long n,d,b,rd,s1,s2;
int main ()
{
scanf("%lld%lld%lld",&n,&d,&b);
for(int i=;i<=n;i++)
scanf("%lld",&rd),fsum[i]=fsum[i-]+rd;
for(int i=;i<=n/;i++)
{
s1+=(fsum[min(n,i*(d+))]-s1*b>=b);
s2+=(fsum[n]-fsum[max(0ll,n-i*(d+))]-s2*b>=b);
}
printf("%lld",n/-min(s1,s2));
return ;
}
05-07 12:03