【贪心】[COCI]电话监测

第二题:Mirko的镇上有一条东西走向的长街,街上住了M户人。每一户的房子都有一个唯一的编号,从1到M。
一场暴风雨过后,这个小镇大部分的电话线都被弄断了。市长决定重建一个新的电话网络。Mirko对电话网的使用率很感兴趣,于是他在电话网络的某些地方安装了一些特殊的分析器。分析器可以分析经过它的电话,也就是说通话的双方如果一个在分析器的东边,一个在分析器的西边,则分析器就能监测到这个电话。
在第一个月的月末,Mirko移除了所有的分析器,现在他想知道在这个月里镇上的居民至少打了多少个电话。
输入数据:
第一行包含2个整数N表示分析器的数目,M表示小镇上房屋的数量。
接下来N行包含两个整数Pi Ci分别表示第i个分析器的位置和它监测到的电话数.我们说分析器的位置在Pi,指的是它在房子Pi和Pi+1之间。
在同一个位置不会放一个以上的分析器。
输出:
一个整数,表示最少的电话数。
输入样例1:
3 4
3 1
2 2
1 1
输出样例1:
2

输入样例2:
2 3
1 23
2 17
输出样例2:
23

输入样例3:
3 9
7 2
8 3
3 4
输出样例3:
5

分析一下可以发现如果当前ai=k那么表示经过当前的一定有k个,那如果下一个(ai+1<ai)小于当前的,那么一定有aiai+1在i到i+1之间结束了,那么这个时候没有增加电话的数量,那么如果ai+1>ai那么一定有ai+1ai个从i到i+1之间出发了。那么实际上就是Ans=1<i<niai+1ai|ai+1>ai注意的是记得从0开始

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int MAXN = 100000;
typedef pair<int, int> pii;
pii p[MAXN+10];
int mabs(int u){return u>0?u:-u;}
int main(){
    int n, m, a, b;
    scanf("%d%d", &n, &m);
    for(int i=1;i<=n;i++){
        scanf("%d%d", &a, &b);
        p[i+1] = make_pair(a, b);
    }
    p[1] = make_pair(0, 0);
    n += 2;
    p[n] = make_pair(m+1, 0);
    sort(p+1, p+1+n);
    long long ans = 0;
    for(int i=2;i<n;i++)
        ans += p[i].second > p[i-1].second ? 1LL * p[i].second - p[i-1].second : 0;
    cout<<ans<<endl;

    return 0;
}

posted on 2015-08-25 14:33  JeremyGuo  阅读(236)  评论(0编辑  收藏  举报

导航