列表

详情


NC25828. 斑羚飞渡

描述

题目背景

两个人之间只能有一个活着 ,这必然是我和你的战争——Harry Potter

题目描述

水宝宝在看完《斑羚飞渡》这本书后,突发奇想,想到了一个有趣的问题

现在峡谷的这边有n只斑羚,每只斑羚跳跃的最远距离为x[i],斑羚在别人的背上起跳的最远距离为y[i],峡谷的两岸的距离为s,问在最好情况下,有几只斑羚可以用别人的背当跳板跳到对岸,但由于斑羚的先天原因(主要是太肥),只能把别人当跳板一次



注:本系列题不按难度排序哦

输入描述

输入格式:

第一行n,s 接下来n行,每行2个整数代表x[i],y[i]

输出描述

输出格式:

一行一个整数,表示有几只斑羚可以用别人的背当跳板跳到对岸

示例1

输入:

5 10
6 8
2 100
7 3
1 10
2 5

输出:

2

说明:

第一组是第三只斑羚跳6的距离,第一只斑羚跳6的距离后从第三只的背上起跳,再跳8的距离后到达对岸

第二组是第五只跳2的距离,第二只跳2的距离后从第五只的背上起跳,跳100的距离到达对岸(假设对岸无限长,不可能跳出对岸)

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 7ms, 内存消耗: 668K, 提交时间: 2022-11-25 11:15:08

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

int i,j,k,n,s,S=0,L=0,R[1000005];
multiset<int>T;
multiset<int>:: iterator t;
int main()
{
	scanf("%d%d",&n,&s);
	for(i=0;i<n;i++)
	{
		scanf("%d%d",&j,&k);
		if(j>=s)S++;
		else if(j+k<s)T.insert(j);
		else R[L++]=s-k;
	}
	for(i=j=0;i<L;i++)
	{
		t=T.lower_bound(R[i]);
		if(t!=T.end())S++,T.erase(t);
		else j++;
	}
	printf("%d\n",S+j/2);
	return 0;
}

上一题