题目传送门 虽然不知道此类问题是否该在这里问 但还是来了
个人认为自己的代码是对的,而且在自己学校的网站上也是对的详见这里
这样了 最有趣的是read的内容全是零
求解qwq qwq qwq 以下呈上代码
#include<bits/stdc++.h>
using namespace std;
int lls;char ls;//快读
int l;//如题
int s,t,m;//如题
int stone[105],end,dis[105],way[10000],f[10000];
//石头:输入用,最终结果,距离,01的存储方法,dp
inline int read()//不必多说
{
lls=0;
ls=getchar();
while(ls>='0'&&ls<='9')
{
lls=(lls<<1)+(lls<<3)+ls-48;
ls=getchar();
}
return lls;
}
int main()
{
l=read();s=read();t=read();m=read();//只是不想浪费快读函数
for(int i=1;i<=m;i++) stone[i]=read();
sort(stone+1,stone+m+1);
m++;stone[m]=l;stone[0]=0;//假设首尾均有石头
if(s==t)//特殊情况判断
{
for(int i=1;i<=m;i++)
{
if(stone[i]%s==0) end++;
}
printf("%d",end);
return 0;
}
l=0;int ls;
for(int i=1;i<=m;i++)//离散化处理
{
ls=stone[i]-stone[i-1];
if(ls>t)
{
l+=ls%t+t;
}
else l+=ls;
way[l]=1;
}
way[0]=0,way[l]=0;//这样就把首位的空给缩了
for(int i=1;i<=l;i++)//dp过程
{
end=200;
for(int j=s;j<=t;j++)
{
if(i-j>=0)
end=min(f[i-j],end);
}
if(way[i]==1) end++;
f[i]=end;
}
end=200;
for(int i=l;i>=l-t+1;i--)
end=min(f[i],end);//输出寻找
printf("%d",end);
return 0;
}