切长条(贪心 区间覆盖)

切长条

https://ac.nowcoder.com/acm/problem/25136

题目描述
给定如图所示的若干个长条。你可以在某一行的任意两个数之间作一条竖线,从而把这个长条切开,并可能切开其他长条。问至少要切几刀才能把每一根长条都切开。样例如图需要切两刀。

注意:输入文件每行的第一个数表示开始的位置,而第二个数表示长度。

输入描述:

Line 1: A single integer, N(2 <= N <= 32000)
Lines 2..N+1: Each line contains two space-separated positive integers that describe a leash. The first is the location of the leash's stake; the second is the length of the leash.(1 <= length <= 1e7)

输出描述:

Line 1: A single integer that is the minimum number of cuts so that each leash is cut at least once.
示例1

输入

7
2 4
4 7
3 3
5 3
9 4
1 5
7 3

输出

2

思路

按右端点排序从小到大,然后依次枚举下一个区间的左端点,看是否覆盖,如果不覆盖说明要再切一刀。坑的地方就是,计算右端点的时候需要减一,就比如说1-9有9个数,然而9-1=8。

代码

//切长条(贪心 区间覆盖)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 32010;
struct S
{
	int start;
	int end;
	
	bool operator < (const S t)const
	{
		return this->end < t.end;
	}
};

S s[N];

int main()
{
 	int n;
 	scanf("%d" , &n);
 	for(int i = 0 ; i < n ; i++)
 	{
 		scanf("%d %d" , &s[i].start , &s[i].end);
 		s[i].end += s[i].start - 1;
	}
 		
 	sort(s , s + n);
 	
 	int cnt = 1;
 	int last = s[0].end;
 	for(int i = 1 ; i < n ; i++)
 	{	 
		if(last < s[i].start)
		{
			cnt++;
			last = s[i].end;
		}	
	}
	
	printf("%d\n" , cnt);
	return 0; 
} 

入门课第一节习题题解

全部评论

相关推荐

06-27 12:30
延安大学 C++
实习+外包,这两个公司底层融为一体了,如何评价呢?
一表renzha:之前面了一家外包的大模型,基本上都能答出来,那面试官感觉还没我懂,然后把我挂了,我都还没嫌弃他是外包,他把我挂了……
第一份工作能做外包吗?
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
Yki_:你要算时间成本呀,研究生两三年,博士三四年,加起来就五六年了,如果你本科去腾讯干五年,多领五年的年薪,加上公司内涨薪,可能到时候十五年总薪资也跟博士差不多
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务