hdu 2217 Visit【贪心】

Visit

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 629    Accepted Submission(s): 248


Problem Description
Wangye is interested in traveling. One day, he want to make a visit to some
different places in a line. There are N(1 <= N <= 2000) places located at points x1, x2, ..., xN (-100,000 ≤ xi ≤ 100,000). Wangye starts at HDU (x = 0), and he travels 1 distance unit in 1 minute . He want to know how many places he could visit at most, if he has T (1 <= T <= 200000 ) minutes.
 

Input
The input contains several test cases .Each test case starts with two number N and T which indicate the number of places and the time respectively. Then N lines follows, each line has a number xi indicate the position of i-th place.
 

Output
For each test case, you should print the number of places,Wangye could visit at most, in one line.
 

Sample Input
  
  
5 16 -3 -7 1 10 8
 

Sample Output
  
  
4
Hint
In the sample, Wangye could visit (-3) first, then goes back to (0), which costs him 6 minutes. Then he visits (1), (8), (10). So he could visit 4 places at most in 16 minutes. :
 

Author
zjt
 


题目大意:

给你N个坐标,初始的时候主人公位于点0处,所有点位于坐标轴上,问在时间T限制内,最多能够访问多少个点。一秒钟移动一个单位距离。


思路:


1、首先将N个点的坐标进行排序,然后设定l【】,表示坐标为负数的集合,设定r【】,表示坐标为正的集合,对应l【i】<l【i+1】(按照排序处理),同理r【i】<r【i+1】。


2、然后,暴力处理,不难分析出其有两种走法:

①选一个点,作为走到的左边的最远点,然后折返 ,向右走到时间耗用结束为止,维护过程中,最大值。

②选一个点,作为走到的右边的最远点,然后折返,向左走到时间耗用结束为止,维护过程中,最大值。


3、输出最大值即可。预估时间复杂度:O(n^2);


Ac代码:


#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[20000];
int l[20000];
int r[20000];
int main()
{
    int n,tt;
    while(~scanf("%d%d",&n,&tt))
    {
        memset(l,0,sizeof(l));
        memset(r,0,sizeof(r));
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        int contl=0;
        int contr=0;
        for(int i=0;i<n;i++)
        {
            if(a[i]<0)
            {
                l[contl++]=a[i];
            }
            else r[contr++]=a[i];
        }
        int output=0;
        for(int i=0;i<contl;i++)
        {
            int tmp=contl-i;
            int time=tt+2*l[i];
            if(time<0)continue;
            for(int j=0;j<contr;j++)
            {
                int use=0;
                if(j==0)use=r[j];
                else use=r[j]-r[j-1];
                if(time>0&&use<=time)
                {
                    time-=use;
                    tmp++;
                }
                else break;
            }
            output=max(output,tmp);
        }
        for(int i=0;i<contr;i++)
        {
            int tmp=i+1;
            int time=tt-r[i]*2;
            if(time<0)continue;
            for(int j=contl-1;j>=0;j--)
            {
                int use=l[j+1]-l[j];
                if(time>0&&time>=use)
                {
                    time-=use;
                    tmp++;
                }
                else break;
            }
            output=max(output,tmp);
        }
        printf("%d\n",output);
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值