uva10020Minimal Coverage

2024-05-05 00:08
文章标签 coverage uva10020minimal

本文主要是介绍uva10020Minimal Coverage,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:数轴上,用给出的线段去覆盖[0,M]段,M也是输入的,要求所用的线段数量最小。

解题:贪心算法。秘诀:先将所有跟[0,M]无关的线段扔掉(线段的右端点<0 或者 线段的左端点>M),在将所有的线段以左端点排序,先第一步找左端点<=0的线段中右端点最长的,记录下右端点end,然后将[0,M]变成[end,M],在以end为左端点找下一条线段(即找左端点<=end的线段中右端点最长的),直到找到的右端点>=M;此题还要求打印用到的线段,那么就将用的线段用visited标记下好了。

代码:

/*
uva 10020 Minimal Coverage
AC By Warteac 
2013-4-13	
Runtime:0.200s
*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
/
struct node{  //segment
int s;    //strat position
int e;    //end position
node(int x,int y){s = x; e = y;}
};
class MinimalCoverage{
private:
int cal(int e);//返回左端点比e小且右端点最大的线段的右端点,并且在visited 中标记此条线段
int M;
vector <node> segment;
vector <int> visited;
int sum;
public:
void initial();
void readCase();
void computing();
void outResult();
};
int MinimalCoverage::cal(int e){
int max = e,i,j = 0;
for(i = 0; (segment[i].s <= e)&& (i < segment.size()); i++){ //左端点小于e
if(segment[i].e > max){  //右端点最大
max = segment[i].e;  
j = i;               //记下线段的序号
}
}
if(max) visited.push_back(j);   //在visited中记录下找到的线段
return max;
}
bool cmp(node n1,node n2){
return (n1.s < n2.s);
}
void MinimalCoverage::initial(){
segment.clear();
M = 0; sum = 0;
visited.clear();
}
void MinimalCoverage::readCase(){
int a,b;
cin >> M;
while((cin >> a >> b) && (a || b)){
if( a > M || b < 0) //第一步筛除与[0,M]无关的线段;
continue;
else
segment.push_back(node(a,b));
}
}
void MinimalCoverage::computing(){
int end = 0,temp = 0;
sort(segment.begin(),segment.end(),cmp);//根据左端点排序
if((segment[0].s > 0)){ //第一条的左端点大于0,不可能覆盖
sum = 0;
}
else {
while(end < M){//右端点没有覆盖到M
end = cal(end); //去找下一条线段覆盖后的右端点
//cout << "end = "<<end<<endl;
temp++;        //线段计数
if(end ==0) break;  //如果其中断掉了,cal返回0
}
if(end >= M)  sum = temp;   //覆盖成功
}
}
void MinimalCoverage::outResult(){
cout << sum <<endl;
if(sum)
for(int x = 0; x < visited.size(); x++){
cout << segment[visited[x]].s <<" "<< segment[visited[x]].e <<endl;      //输出被标记的线段
}
cout<<endl;
}
/
int main(){
MinimalCoverage mc;
int n;
cin >> n;
while(n--){
mc.initial();
mc.readCase();
mc.computing();
mc.outResult();
}
return 0;
}



这篇关于uva10020Minimal Coverage的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Minimal coverage -uva 覆盖线段,贪心

一道经典的贪心问题,具体方法就是将(an,bn)区间,按照an从小到大的顺序进行排序,之后从0开始, 取最大的有效区间,这里用到了结构体的快排,否则可能会超时. #include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_SIZE 100000 + 10#define BOTTOM -50000 - 10str

NLP-生成模型-2014:Seq2Seq【缺点:①解码器无法对齐编码器(Attention机制);②编码器端信息过使用或欠使用(Coverage机制);③解码器无法解决OOV(Pointer机制)】

《原始论文:Sequence to Sequence Learning with Neural Networks》 Seq2Seq模型是将一个序列信号,通过“编码&解码”生成一个新的序列信号,通常用于机器翻译、语音识别、自动对话等任务。 Seq2Seq(多层LSTM-多层LSTM)+Attention架构是Transformer提出之前最好的序列生成模型。 我们之前遇到的较为熟悉的序列问题,

ural Minimal Coverage (区间覆盖)

http://acm.timus.ru/problem.aspx?space=1&num=1303 给出一些区间,选择尽量少的区间能覆盖到[0,m]。 小白p154,典型的区间覆盖问题。一直在想怎么dp。。 首先预处理,先按左端点从小到大排序,若左端点相同右端点从大到小排序,若区间x完全包含y,按照贪心的思想,y是没有意义的,有大区间可以选何必选择小区间。处理完事之后各个区间满足a1

BNU 7536 HDU 3425 Coverage (圆与直线相交 )TeamContest - 4—B【解题报告】

【题目链接】click here~~ 【题目大意】求多个圆与线段相交的部分占整个线段的百分比。 【解题思路】  此题首先要判断圆心不一定全在给定的线段上,可以在任意的位置,(理解错了题,原先以为圆心在线段上,读题要仔细!) 因此我们可以联立圆的方程和线段的方程首先判断线段与圆有没有交点 求出方程组解得: 二次项系数为  a = cos(cx1,cx0) +cos(cy1,cy0);//二次项的

uva10020 - Minimal coverage(区间覆盖)

题目:uva10020 - Minimal coverage(区间覆盖) 题目大意:给出一些线段,然后问怎样取能使得最少的线段覆盖区间[0, M]. 解题思路:先预处理掉那些和区间【0,M】不沾边的线段。                  将线段按照起点小的排序。                   接着遍历这些线段。首先先判断起点最小的点是否<=0,如果不满足这个说明它不能覆

量产导入 | ATPG Test_coverage_faults

文章目录 目标FaultsFault LocationsSpecifying the Fault Universe: Add FaultsSpecifying the Fault Universe: Excluding FaultsSpecifying the Fault Universe: Fault SamplingFault ClassesFault Class(TE): Detect

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)更优 会不会

python coverage如何使用

Python的`coverage.py`是一个测量代码覆盖率的工具,它可以告诉你在测试中哪些代码被执行了,哪些没有。这对于确保你的测试覆盖了所有情况非常有用。以下是如何使用`coverage.py`的基本步骤: ### 安装 首先,你需要安装`coverage.py`。你可以使用pip来安装它: ```bash pip install coverage ``` ### 命令行使用 `co

论文阅读 seq2seq模型的coverage机制

Get To The Point: Summarization with Pointer-Generator Networks Abigail See, Peter J. Liu, Christopher D. Manning Standford University & Google Brain, 2017 这是ACL2017上的一篇文章,提出了coverage机制,目的是为了解决seq2

3. Antenna Coverage

题目链接:Antenna Coverage 数轴上有 n n n 个天线,每个天线都有一定的辐射范围,可以支付 k k k 的费用让某个天线的辐射半径增加 k k k,可以任意执行修改操作,问覆盖区间 [ 1 , m ] [1,m] [1,m] 的最少费用。 各种贪心似乎都是不行的。观察数据范围, O ( n m ) O(nm) O(nm) 的复杂度可以通过。尝试 dp,令 d p