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. iOS进阶之如何进行 HTTP Mock(转载)

    这篇文章会对 OHHTTPStubs 源代码的分析,其实现原理是建立在 NSURLProtocol 的基础上的,对这部分内容不了解的读者,可以阅读这篇文章 iOS 开发中使用 NSURLProtoco ...

  2. UWP中MarkupExtension的使用

    Xaml作为一种描述语言,在编程中极大地简化了页面开发的繁琐及时间消耗,这得益于它的多种特性:数据绑定.动画.资源文件等等.标记扩展作为其一个特性,在xaml中有不可替代的作用,今天分析下自定义标记扩 ...

  3. java和js中int和String相互转换常用方法整理

    java中int和String的相互转换常用的几种方法: int  > String int i=10;String s="";第一种方法:s=i+""; ...

  4. day07数据类型的相互转化,字符编码

    复习 ''' 1.深浅拷贝 ls = [1, 'a', [10]] 值拷贝:直接赋值 ls1 = ls, ls中的任何值发生改变,ls1中的值都会随之改变 浅拷贝:通过copy()方法 ls2 = l ...

  5. SAP abap 语句、命令 语法查询备用

    语句:碰到一个写一个 COLLECT语句用法 用于报表数据的合并计算,如果非数据字段值相等,那么数值字段值相加 内表可以不用排序 LOOP AT gtd_test into gth_test. COL ...

  6. StringBuffer的delete方法与deleteCharAt方法的区别。

    delete方法与deleteCharAt两个方法都是用来删除StringBuffer字符串指定索引字符的方法, delete(int  begin,int  end)有两个参数,使用时删除索引从be ...

  7. js打印html指定元素,解决动态获取的图片无法打印问题

    用js来调用浏览器的打印接口很容易,一两行代码就能搞定,但是有些数据是通过动态生成的,例如一些动态生成的二维码,有时候调用打印接口图片会无法显示 为了解决这个问题,建议使用下面这个库 下载:https ...

  8. Ubuntu16.04 使用sudo cat EOF 编辑文件,提示Permission denied错误的解决办法

    一.执行命令报错 在Ubuntu16.04下,使用如下命令,修改hosts主机文件,居然提示权限错误: catty@node186:~$ sudo cat <<EOF > /etc/ ...

  9. Axure文本框验证和外部url的调用

    文本框的验证和外部url的调用: 场景: 当输入文本框中的内容是满足下面条件时:输入4-10的数字,页面会跳转到QQ注册(https://ssl.zc.qq.com/v3/index-chs.html ...

  10. hbase之认识

    进入HBase客户端命令操作界面    $ bin/hbase shell 查看帮助命令        hbase(main):001:0> help 查看当前数据库中有哪些表        h ...