题目描述
给定如图所示的若干个长条。你可以在某一行的任意两个数之间作一条竖线,从而把这个长条切开,并可能切开其他长条。问至少要切几刀才能把每一根长条都切开。样例如图需要切两刀。
注意:输入文件每行的第一个数表示开始的位置,而第二个数表示长度。
注意:输入文件每行的第一个数表示开始的位置,而第二个数表示长度。
输入描述:
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; }