HDU5037 frog贪心

来源:互联网 发布:macbook air如何写编程 编辑:程序博客网 时间:2024/04/27 06:56

这题虽说不是很难,但在推理时实在把自己绕晕了。

这题采用贪心的作法。

我是从终点开始考虑的。

假设当前位置为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 200010int 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;}


0 0
原创粉丝点击