今天XXX来到HUTC的美食一条街,准备大吃一顿.
美食一条街为一维坐标,上面共有n个餐馆,第i个餐馆的坐标为x_i(同一地点可能有多个餐馆). XXX单位时间移动速度为1,即从坐标x到坐标y所花费时间为|x-y|.
当然由于餐馆的食物质量以及上菜速度不同,在XXX经过i号餐馆后,他可以花t_i的时间吃完第i号餐馆的美食,当然他也可以仅仅从第i号餐馆门前经过。
XXX共有m个单位时间,并且他起始位置为0,可以假设他胃无限大,问他最多能在多少餐馆吃美食。
输入格式:
第一行包含两个整数 n,m。
接下来 n行,每行包含两个整数 x_i,t_i。
数据说明:1≤n≤105 , 0≤m,x_i≤108 , 0≤t_i≤109
输出格式:
一个整数,表示能吃到最多餐馆数。
输入样例1:
2 10
1 100
5 5
输出样例1:
1
输入样例2:
8 100
25 19
40 16
35 14
15 13
5 16
10 21
30 27
20 10
输出样例2:
4
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 5;
struct node{
int x, t, id;
};
bool cmp_x(node a, node b) {
return a.x < b.x;
}
bool cmp_t(node a, node b) {
return a.t < b.t;
}
int main() {
int n, m, ans = 0;
node rest[maxn];
int lef[maxn] ,flag[maxn];
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> rest[i].x >> rest[i].t;
}
sort(rest, rest + n, cmp_x);
for (int i = 0; i < n; i++) {
rest[i].id = i;
}
for (int i = 0; i < n; i++) {
lef[i] = m - rest[i].x - rest[i].t;
}
sort(rest, rest + n, cmp_t);
for (int i = n - 1; i >= ans; i--) {
for (int j = 0; j < i; j++) {
if (rest[j].id == i) {
flag[j] = 1;
break;
}
}
if (lef[i] < 0) {
continue;
}
int summ = 0;
int cnt = 0;
for (int j = 0; j < i; j++) {
if (flag[j]) {
continue;
}
summ += rest[j].t;
if (summ > lef[i]) {
break;
} else{
cnt++;
}
}
ans = max(ans, cnt + 1);
}
cout << ans;
return 0;
}