切长条
题目描述
给定如图所示的若干个长条。你可以在某一行的任意两个数之间作一条竖线,从而把这个长条切开,并可能切开其他长条。问至少要切几刀才能把每一根长条都切开。样例如图需要切两刀。 注意:输入文件每行的第一个数表示开始的位置,而第二个数表示长度。
输入描述:
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.
输入
7
2 4
4 7
3 3
5 3
9 4
1 5
7 3
输出
2
题目大意
若干长条,最少多少刀,全部切开
思路
按左端点排序 不断更新最小右端点,如果左端点大于等于最小右端点,则不重合,需要切一刀,最后要加上一刀
#include<bits/stdc++.h> using namespace std; struct date{ int l=0; int r=0; }F[32005]; bool cmp(date a,date b){ return a.l<b.l; } int main() { //任意两个数之间做竖线,切开长条,至少几刀都切开 //当起点,大于等于排序后前一个点的时候(最小值),给一刀 int n,sum=0; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&F[i].l,&F[i].r); F[i].r=F[i].l+F[i].r; } sort(F,F+n,cmp); int minn=F[0].r; for(int i=1;i<n;i++) { minn=min(minn,F[i].r); //更新最新最小右端点 //printf("前r和现r的最小值=%d ",minn); if(F[i].l>=minn) sum++,minn=F[i].r;//判断并更新结束点最小值 //printf("l=%d r=%d min2=%d\n",F[i].l,F[i].r,minn); } printf("%d",sum+1); return 0; }