【贪心】[COCI]电话监测

来源:互联网 发布:梦龙软件视频教程 编辑:程序博客网 时间:2024/05/16 04:46

第二题: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在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;}
0 0
原创粉丝点击