HDU 2217 Visit

http://acm.hdu.edu.cn/showproblem.php?pid=2217

 

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

代码:

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
int N, T;
int l[maxn], r[maxn];
int ll[maxn], rr[maxn];

bool cmp(int a, int b) {
    return a > b;
}

int main() {
    while(~scanf("%d%d", &N, &T)) {
        memset(ll, 0, sizeof(ll));
        memset(rr, 0, sizeof(rr));
        int num1 = 0, num2 = 0, Zero = 0;
        for(int i = 1; i <= N; i ++) {
            int x;
            scanf("%d", &x);
            if(x > 0)
                r[num1 ++] = x;
            else if(x < 0)
                l[num2 ++] = x;
            else
                Zero ++;
        }

        sort(r, r + num1);
        sort(l, l + num2, cmp);

        for(int i = 0; i < num1; i ++) {
            int k = i + 1;
            for(int j = 0; j < num2; j ++) {
                if(r[i] * 2 + abs(l[j]) <= T)
                    rr[i] = ++ k ;
                else break;
            }
        }

        for(int i = 0; i < num2; i ++) {
            int k = i + 1;
            for(int j = 0; j < num1; j ++) {
                if(abs(l[i]) * 2 + r[j] <= T)
                    ll[i] = ++ k ;
                else
                    break;
            }
        }

        sort(ll, ll + num2);
        sort(rr, rr + num1);
        int ans = max(ll[num2 - 1], rr[num1 - 1]);

        int cnt = 0;
        for(int i = 0; i < num1; i ++)
            if(r[i] <= T)
                cnt = i;
        for(int i = cnt; i < num2; i ++)
            if(abs(l[i]) <= T)
                cnt = i;

        ans = max(ans, cnt);
        printf("%d\n", ans + Zero);
    }
    return 0;
}

  

posted @ 2018-10-29 20:42  丧心病狂工科女  阅读(201)  评论(0编辑  收藏  举报