CSDN的博客

友键

【题目描述】

有一条很长的尺子,上面标记着整数点的坐标。如:

现在给出n条线段,每条线段表示为x—y(x和y为整数,x<=y),两条线段能合并的条件是x—y,y—z,合并为x—z。比如线段2—4和线段4—6可以合并为线段2—6。(线段2—4和线段3—6则不可以合并为线段2—6)

求最终能合并的最长的线段,且输出这条最长的线段是由多少条小线段组成的。

比如有6条线段:2—7,1—3,3—12,12—20,7—10,4—50

那么可以合并成以下线段:

1—3,3—12,12—20 长度为20-1=19 由3个线段组成

2—7,7—10 长度为10-2=8 由2个线段组成

4—50 长度为50-4=46 由1个线段组成

那么最长的一条就是第三个,所以结果为46,1。

需要注意的是:如果有两条不一样的连续的线段长度同时为最大,那么取组成线段数多的一条。

例子:1—5,5—10,1—10,输出: 9,2

【输入文件】

第一行为一个整数n;

第二行到第n+1行,每行两个整数A B,记录一条线段的信息。

【输出文件】

输出一个整数,即能合并成的最长的线段的长度和组成它的线段数。

【输入输出样例1】

7

1 5

10 12

3 10

2 7

2 10

12 16

7 9 14 3

【样例1数据提示】

1—5 长度为4 由1个页段组成

3—10,10—12,12—16 长度为13 由3个页段组成

2—7,7—9 长度为7 由2个页段组成

2—10,10—12,12—16 长度为14 由3个页段组成

所以输出最长的页段的长度即14由3个页段组成

【数据规模】

对于30%的数据:1<=n<=20;对于100%的数据:1<=n<=500 ,0<=A<B<500

其实这道题有点DP的意思了

先进行排序,y来排序。

我们先定义一个s数组,s[i]表示以线段i结尾的能合并的线段最长为多长

定义c数组,c[i]表示以线段i结尾的能合并的线段最长的最多要多少条线段

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int x,y;
}a[510];
bool cmp(node x,node y){return x.y<y.y;}
int n,s[510],c[510];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d%d",&a[i].x,&a[i].y);//输入
sort(a+1,a+n+1,cmp);//排序
for(int i=1;i<=n;++i)
{
s[i]=a[i].y-a[i].x;//初始化,s[i]最长为线段i的长度
c[i]=1;//有一条线段,为线段i
for(int j=i-1;j>=1;--j)
if(a[j].y==a[i].x)
//如果线段i的头部(x)能和线段j的尾部(y)连接的话
{
if(s[i]<s[j]+a[i].y-a[i].x)//判断是否能更新长度
{
//能更新
s[i]=s[j]+a[i].y-a[i].x;
c[i]=c[j]+1;//更新长度
}
//若不能更新长度
else if(s[i]==s[j]+a[i].y-a[i].x)
//判断是否长度相等
{
if(c[i]<c[j]+1)c[i]=c[j]+1;
//可以就更新
}
}
}
int maxa=0,maxb=0;
//maxa求最长的长度,maxb求合并的线段最长的最多要多少条线段
for(int i=1;i<=n;++i)//更新,不多说
{
if(s[i]>maxa)
{
maxa=s[i];maxb=c[i];
}
else if(s[i]==maxa)
{
if(maxb<c[i])maxb=c[i];
}
}
printf("%d %d\n",maxa,maxb);//输出,完结撒花
return 0;
}

纯代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int x,y;
}a[510];
bool cmp(node x,node y){return x.y<y.y;}
int n,s[510],c[510];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d%d",&a[i].x,&a[i].y);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;++i)
{
s[i]=a[i].y-a[i].x;
c[i]=1;
for(int j=i-1;j>=1;--j)
if(a[j].y==a[i].x)
{
if(s[i]<s[j]+a[i].y-a[i].x)
{
s[i]=s[j]+a[i].y-a[i].x;
c[i]=c[j]+1;
}
else if(s[i]==s[j]+a[i].y-a[i].x)
{
if(c[i]<c[j]+1)c[i]=c[j]+1;
}
}
}
int maxa=0,maxb=0;
for(int i=1;i<=n;++i)
{
if(s[i]>maxa)
{
maxa=s[i];maxb=c[i];
}
else if(s[i]==maxa)
{
if(maxb<c[i])maxb=c[i];
}
}
printf("%d %d\n",maxa,maxb);
return 0;
}

caioj.cn 3004:中山市第九届小学生信息学邀请赛试题 5.合并线段的更多相关文章

  1. UVA 12663 第九届省赛 高桥与低桥 线段树

    题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次 看下数据10的五次方,10的五次方 ...

  2. 谈一谈第九届移动互联网开发者大会( MDCon 2016 )

    4G时代的开启以及移动终端设备的凸显必将为移动互联网的发展注入巨大的能量,2016年移动互联网产业必将带来前所未有的飞跃.第九届移动互联网开发者大会以"DT时代的移动开发技术创新" ...

  3. 2018年第九届蓝桥杯B组题C++汇总解析-fishers

    2018年第九届蓝桥杯B组题C++解析-fishers 题型 第一题:第几天 第二题:明码 第三题:乘积尾零 第四题:测试次数 第五题:快速排序 第六题:递增三元组 第七题:螺旋折线 第八题:日志统计 ...

  4. nyoj1273 河南省第九届省赛_"宣传墙"、状压DP+矩阵幂加速

    宣传墙 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ...

  5. NYOJ 1272 表达式求值 第九届省赛 (字符串处理)

    title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...

  6. 第二十四届全国青少年信息学奥林匹克联赛初赛 普及组C++语言试题

    第二十四届全国青少年信息学奥林匹克联赛初赛 普及组C++语言试题 1.原题呈现 2.试题答案 3.题目解析 因博客园无法打出公式等,所以给你们几个小编推荐的链接去看看,在这里小编深感抱歉! https ...

  7. 河南省acm第九届省赛--《表达式求值》--栈和后缀表达式的变形--手速题

    表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3   描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, ...

  8. 第九届蓝桥杯国赛+第二天的第11届acm省赛的总结

    第九届蓝桥杯国赛+第二天的第11届acm省赛的总结 25号坐的去北京的火车,10个小时的火车,然后挤了快两个小时的地铁,最终达到了中国矿业大学旁边的订的房间.12个小时很难受,晕车症状有点严重,吃了快 ...

  9. 2018年第九届蓝桥杯题目(C/C++B组)汇总

    第一题 标题:第几天 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容. 解题思路: 1.  判断2月有几天, ...

随机推荐

  1. 对八皇后的补充以及自己解决2n皇后问题代码

    有了上次的八皇后的基础.这次准备解决2n皇后的问题,: //问题描述// 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行./ ...

  2. oracle中新建用户和赋予权限

    1.新建个用户 create user xxxxx(用户名) identified by "密码" alert user 用户名 identified by “新密码” --修改用 ...

  3. elasticsearch 常用命令

    #查看集群状态 curl -XGET "http://localhost:9200/_cluster/health?pretty" #查看所有的快照 curl -XGET &quo ...

  4. FL Studio中的音频设置

    在FL Studio中,有一步很关键的设置需要我们详细熟悉了解,它就是音频设置,什么是音频设置呢?它就是需要我们选择音频设备驱动程序并优化设置.在了解音频设备之前,我们先来看看什么是音频设备. 我们的 ...

  5. 测试框架Unitest的运行原理,以及多个测试类中的执行顺序以及简化方法

    单元测试单元测试(unit testing)是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一 ...

  6. 8位、16位、32位单片机中的“XX位”指什么?

    32位单片机的32位是指单片机的“字长”,也就是一次运算中参与运算的数据长度,这个位是指二进制位. 如果总线宽度与CPU一次处理的数据宽度相同,则这个宽度就是所说的单片机位数. 如果总线宽度与CPU一 ...

  7. vue drag 对表格的列进行拖动排序

    用drag实现拖动表格列进行列排序   以下是用到的主要方法   1.dragstart 拖动开始返回目标对象 2.dragenter 拖动过程中经过的对象 3.dragend 拖动结束返回目标对象 ...

  8. 在linux上运行网页程序及日志文件查看

  9. Autofac IOC框架

    ASP.NET Core自带了一个轻量级的IOC容器     但是只提供了最基本的AddXXX方法来绑定实例关系     需要一个一个添加   可以使用其他IOC容器来替换内置的 ABP自带Castl ...

  10. PyQt5——隐藏控件并保留位置

    原文地址:https://blog.csdn.net/qq_38161040/article/details/86605798 ———————————————————————————————— 设置控 ...