题意:有N个建筑,若连续的X个建筑中,存在C个增幅塔,那么X个建筑都受到增幅;除增幅塔外还有M个塔基在位置ai上
问至少还要建多少增幅塔才能使路上所有建筑物都受到增幅。
思路:标记增幅塔位置,区间c个建筑物向右推进,如果当前区间增幅塔数少于X个,从后往前加增幅塔直到等于X个;
向右推进方法,去掉左塔,加上右塔。
具体看代码
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int n,m,c,x,vis[maxn];
int main()
{
scanf("%d%d%d%d",&n,&x,&c,&m);
for (int i=0;i<m;i++)
{
int temp;
scanf("%d",&temp);
vis[temp]=1;
}
int l=1, r=x;
int cnt=0;
for (int i=l;i<=r;i++)
{
cnt+=vis[i];
}
while(r<=n)
{
if(c-cnt>0)
{
int num=c-cnt;
for (int i=r;i>=l;i--)
{
if(vis[i]==0)
{
vis[i]=1;
num--;
}
if(num==0) break;
}
cnt=c;
}
cnt-=vis[l];
l++;r++;
cnt+=vis[r];
}
int res=0;
for(int i=1;i<=n;i++)
{
res+=vis[i];
}
printf("%d\n", res-m);
return 0;
}