这题虽说不是很难,但在推理时实在把自己绕晕了。
这题采用贪心的作法。
我是从终点开始考虑的。
假设当前位置为cur,前一次走的位置为pre.
若此时pre-a[i]>l则下一步pre=cur,cur=pre-l-1;
否则cur=a[i];
下面的问题就是推出pre的通式,通过pre-a[i]<=l来解不得式。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define maxn 200010
int cmp(const void *a,const void *b){
return *(int*)b-*(int*)a;
}
int a[maxn];
int T;
int main(){
scanf("%d",&T);
int tt=1;
while(T--){
int n,m,l,i;
scanf("%d%d%d",&n,&m,&l);
a[0]=0;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
qsort(a,n+1,sizeof(a[0]),cmp);
int ans=1;
int pre=m,cur=m-1;
int x,y;
for(i=0;i<=n;i++)if(pre-a[i]>l){
x=1+ceil(2.0*(cur-l-a[i])/(l+1));
y=ceil(2.0*(pre-l-a[i])/(l+1));
if(x%2==0)x++;
if(y%2==1)y++;
if(x<y){
ans+=x;
pre=cur-(x-1)/2*(l+1);
cur=a[i];
}
else{
ans+=y;
pre=pre-y/2*(l+1);
cur=a[i];
}
}
else cur=a[i];
printf("Case #%d: %d\n",tt++,ans);
}
return 0;
}