题目大意

每个苹果会在 tit_iti 秒在 xix_ixi 这个位置上掉落,你需要派机器人在苹果正好落地时将其接住,即在 tit_iti 时刻恰好在 xix_ixi,每个机器人每秒可以移动到相邻位置或不动,机器人初始位置由你决定请问接住所有苹果所需的最少机器人数量。

思路

首先有一个经典的操作,就是把 iii 对应到 [xi−ti,xi+ti][x_i-t_i,x_i+t_i][xiti,xi+ti],在这个区间内的位置是可以接住这个苹果的。

然后感性理解一下,随着时间的推移,我们不禁常常追忆过去,每个区间都会缩水,左边界和右边界都会向中靠拢一个,那么我们可以推出两个区间必须是包含关系才可以用一个机器人。

那这是为什么呢?(教一年级小朋友的语气),如果两个区间他们在缩水到不相交的时刻,如果两个区间长度都还大于等于 111(即没有消失),那么他们就肯定不可以用一个机器人解决。所以如果必须要一个机器人解决两个区间必须有包含关系。

那么,这道题就变简单了,接下来问题转化区间包含问题。我们直接将区间左端点从大到小排序然后就成了最长上升子序列问题了。

代码

#include<bits/stdc++.h>

using namespace std;

const int MAXX = 4e5 + 5;

struct pp{
  int l, r;
} a[MAXX];

int n, t, x;
multiset<int> zrr;

bool cmp(pp a, pp b){
  if(a.l != b.l) return a.l > b.l;
  return a.r < b.r;
} 

int main(){
  cin >> n;
  for(int i = 1; i <= n; i++) cin >> t >> x, a[i] = {x - t, x + t};
  sort(a + 1, a + 1 + n, cmp);
  for(int i = 1; i <= n; i++){
    auto num = zrr.upper_bound(a[i].r);
    if(num != zrr.begin()) zrr.erase(--num);
    zrr.insert(a[i].r);
  }
  cout << zrr.size();
  return 0;
} 

完结,撒花★,°:.☆( ̄▽ ̄)/$:.°★

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐