Ural 1303. Minimal Coverage / 最小区间覆盖

2024-06-15 11:58

本文主要是介绍Ural 1303. Minimal Coverage / 最小区间覆盖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

求最小区间覆盖0-m 以前做过 现在墨迹半天写出来 弱爆了

像这样的1 9 和 2 7 根据贪心原理后者不需要直接去掉

然后按照起点从小到大排序 在按照终点从大到小排序  贪心模拟一下每次能不选就不选

(1 6)  (1 5)  (2 9)   (3 10)   (7 10)选择(1 6) 之后 下一个选择是(3 10) 他是最后一个能选的  不选就会断开 并且比选(2 9)更优

会不会说如果是这样(1 6)  (1 5)  (2 12)   (3 10)   (7 10) 不选(3 10) 选(2 12)更优 之前说过了 预处理(2 10)包含了(3 10) 所以(3 10) 在贪心之前先去掉了

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 100010;
struct node
{int s, e;
}a[maxn], b[maxn], ans[maxn];
bool cmp(node a, node b)
{if(a.s != b.s)return a.s < b.s;return a.e > b.e;
}
int main()
{int m, n;while(scanf("%d", &m) != EOF){n = 0;int s, e;while(scanf("%d %d", &s, &e) , s || e){a[n].s = s;a[n++].e = e;}sort(a, a+n, cmp);int i, j, k = 0;b[0] = a[0];for(i = 1; i < n; i++){if(a[i].s > b[k].s && a[i].e > b[k].e)b[++k] = a[i];}n = k;n++;b[n].s = m+1;b[n].e = m+1;k = 0;int y = -1;for(i = 0; i < n; i++){if(b[i+1].s > 0 && b[i].s <= 0){ans[k++] = b[i];y = b[i].e;break;}}if(!k){puts("No solution");continue;}for(; i < n; i++){if(y >= m){break;}if(b[i+1].s > y && b[i].s <= y){ans[k++] = b[i];y = b[i].e;}}if(!k || y < m){puts("No solution");continue;}else{printf("%d\n", k);for(i = 0; i < k; i++){printf("%d %d\n", ans[i].s, ans[i].e);}}}return 0;
}
/*
1
0 100
-1 0
-5 -3
2 5
0 04
0 2
3 4
-1 0
-5 -3
3 5
0 06
0 2
1 2
2 3
3 4
4 5
2 4
5 6
3 6
0 9
-1 100
0 0*/


 

 

这篇关于Ural 1303. Minimal Coverage / 最小区间覆盖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063385

相关文章

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为