hdu~2217(简单dp)

来源:互联网 发布:大数据挖据市场前景 编辑:程序博客网 时间:2024/06/05 14:51

visit

题意:在x轴上,出发点在0的位置,给你一些其他点的位置,求在规定时间内能遍历最多的点的个数。

其实个人觉得不会dp的人也能做,说是dp也算不上。

以0为起点,负半轴为左边。

1.先开两个数组l[],r[]存左右两边各点到0的距离。

2.再开两个数组lm[],rm[]存以上述各点为拐点能遍历的最多点的个数。


具体的还是看代码好理解:

<span style="font-size:18px;">#include <stdio.h>#include <string.h>#include <stdlib.h>int cmp(const void *a,const void *b){    return *(int *)a-*(int *)b;}int fmax(int a,int b){    return a>b?a:b;}int main(){    int n,t,x,li,ri,sum;    int l[2005],r[2005];    //记录左右两边到0点距离大小    int lm[2005],rm[2005];  //记录以i为拐点能遍历的最多点数    while(scanf("%d %d",&n,&t)!=EOF)    {        memset(lm,0,sizeof(lm));        memset(rm,0,sizeof(rm));        ri=0,li=0,sum=0;        l[0]=r[0]=0;        for(int i=1;i<=n;i++)   //生成l[],r[],记录点为0的个数        {            scanf("%d",&x);            if(x<0)                l[++li]=-x;            else if(x>0)                r[++ri]=x;            else                sum++;        }        qsort(&l[1],li,sizeof(int ),cmp);   //升序排序        qsort(&r[1],ri,sizeof(int ),cmp);        for(int i=1;i<=li;i++)      //先从左边走        {                   int k=i;                //以i为拐点,至少得走到i点            for(int j=1;j<=ri;j++)            {                if(l[i]*2+r[j]<=t)  //走到左边第i个再走到右边第j个所花时间                    lm[i]=++k;                      else                                    break;            }        }        for(int i=1;i<=ri;i++)      //走右边走,同上        {            int k=i;            for(int j=1;j<=li;j++)            {                if(l[j]+r[i]*2<=t)                    rm[i]=++k;                else                    break;            }        }        int max=0;        for(int i=1;i<=li;i++)  //若不拐,从两边走能遍历最多点数            if(l[i]<=t)                max=i;        for(int i=max;i<=ri;i++)            if(r[i]<=t)                max=i;                        for(int i=1;i<=li;i++)  //若拐弯,能遍历最大点数            max=fmax(max,lm[i]);        for(int i=1;i<=ri;i++)            max=fmax(max,rm[i]);        printf("%d\n",max+sum);    }    return 0;}</span>





0 0
原创粉丝点击