列表

详情


NC20910. 营救

描述

YYF在建立起一个完善的情报网络之后。收到了来自上级的指示。他需要潜入敌方的监狱中去营救被俘虏的RMY。
已知在YYF潜入监狱的路径上是一条直线并且有一些点,YYF只能在这些点上行走,每一个点都有一个影响值,只有当两个点的影响值加起来不大于两个点之间的距离时,YYF才能在这两个点之间跳跃。由于YYF和RMY是一对冤家,所以他不想RMY提早被救出来,但是他又不能在这里干坐着,因为陈独秀会打他。所以你需要求出YYF在去监狱的路径上最多能够经过几个点。每个点只能经过一次,已知在最开始的时候YYF可以随机选择一个点作为起点。

输入描述

第一行一个数N(N≤106),表示有N个点。
第二行有N个整数,第i个整数xi (xi≤107)个表示第i个点的坐标
之后的一行N个整数ai (ai≤100000),表示每一个点的影响值。

输出描述

只有一行,包含一个整数,表示最多能够经过的点的数量。

示例1

输入:

5
1 5 7 8 12
2 1 5 2 3

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 801ms, 内存消耗: 12152K, 提交时间: 2020-04-05 21:59:25

#include<bits/stdc++.h>
using namespace std;
int i,j,s,N;
struct h{
    int l,r;
} q[1000003];
bool cmp(h A,h B){
    if(A.r==B.r) return A.l>B.l;
    return A.r<B.r;
}
int a[1000003];
int main(){
    cin>>N;
    for(i=0;i<N;i++) cin>>a[i];
    for(i=0;i<N;i++) cin>>j,q[i].l=max(0,a[i]-j),q[i].r=a[i]+j;
    sort(q,q+N,cmp);
    for(i=j=s=0;i<N;i++)
    if(q[i].l>=j) j=q[i].r,s++;
    cout<<s;
}

上一题