切长条

题目描述

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

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

输入描述:

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

思路:用结构体来保存每个长条的信息,然后对长条进行排序。长条结束点小的在前,如果结束点相等,那么起始点小的在前。对排好序的长条从小到大遍历,
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=32005;
struct node
{
    int a;
    int b;
}arr[maxn];

bool cmp(node x,node y)
{
    if(x.b==y.b)
        return x.a<y.a;
    else
        return x.b<y.b;
}

int main()
{
    int n,i;
    cin>>n;
    for(i=0;i<n;i++)
    {
        //cin>>arr[i].a>>arr[i].b;
        scanf("%d %d",&arr[i].a,&arr[i].b);
        arr[i].b=arr[i].a+arr[i].b;
    }
    sort(arr,arr+n,cmp);
    int ans=0,m=0;
    for(i=0;i<n;i++)
    {
        if(arr[i].a>=m)
        {
            ans++;
            m=arr[i].b;
        }
    }
    cout<<ans<<endl;
    return 0;
}


 
原文地址:https://www.cnblogs.com/adventurer-/p/12953721.html