区间覆盖问题

fdg个sggggg 2008-11-10 08:20:54
区间覆盖问题,M代表要覆盖的区间数,N代表要用的线段总数,没个区间的长度为一,
要求输出最小的线段总长和这些线段的端点信息。 帮忙给改一下,急急急

#include <iostream>
#include <stdlib.h>

using namespace std;
int a=0,b=0,c=0,d=0;
const int size=200;
void sort(int value[],int nNumber)
{
for(int i=0;i <nNumber-1;i++)
for(int j=0;j <nNumber-1-i;j++)
if(value[j] <value[j+1])
{
int temp=value[j];
value[j]=value[j+1];
value[j+1]=temp;
}
}
int main(int argc, char *argv[])
{
int M=0;
int position[size];
cout < <"请输入要覆盖的区间总数M=";
cin>>M;
cout < <"请输入" < <M < <"个要覆盖的区间:" < <endl;
int i=0;
for(i=0;i <M;i++)
cin>>position[i];
sort(position,M);
int distance[size-1];
for(i=0;i <M-1;i++)
distance[i]=position[i+1]-position[i]-1;
sort(distance,M-1);
int N=1;
cout < <"请输入可用线段总数N=";
cin>>N;
if(N>M)
{
cout < <"最小线段总长" < <M < <endl;
for(i=0;i <5;i++)
cout < <"端点" < <i < <position[i]-1 < <"->" < <position[i] < <" ";
return 1;
}
int nline =1;
int ntotlelength=position[0]-position[M-1]+1;
int ndivide=0;
while((nline <N)&&(distance[ndivide]>0))
{
nline++;
ntotlelength-=distance[ndivide];
ndivide++;
}
cout < <"最小线段总长" < <ntotlelength < <endl;
for(i=0;i <M;i++)
{
if(position[i+1]-position[i]-1==3)
{
cout < <position[i];
cout < <position[i+1]-1;
}
if(position[i+1]-position[i]-1==2)
{
cout < <position[i];
cout < <position[i+1]-1;
}
}

system("PAUSE");
return 0;
}
...全文
639 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ninghui45 2008-12-05
  • 打赏
  • 举报
回复
我也在找这个程序呀!!
giftfish 2008-11-10
  • 打赏
  • 举报
回复
没看懂题目,可以看看《编程之美》,有这方面的解决方案
太乙 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 a497332345 的回复:]
没个区间的长度都是i-1到i,输入的几个数1 3 5 7 11代表0-1,2-3,4-5,6-7,10-11,用三条线段覆盖这些区间要求线段长度最短,然后输出这些线段的端点。
[/Quote]


有没有正确的输出!!!!!!!!!!!!!


我服了lz了!!!!!!!!!
fdg个sggggg 2008-11-10
  • 打赏
  • 举报
回复
没个区间的长度都是i-1到i,输入的几个数1 3 5 7 11代表0-1,2-3,4-5,6-7,10-11,用三条线段覆盖这些区间要求线段长度最短,然后输出这些线段的端点。
fdg个sggggg 2008-11-10
  • 打赏
  • 举报
回复
没个区间的长度都是i-1到i,输入的几个数1 3 5 7 11代表0-1,2-3,4-5,6-7,10-11,用三条线段覆盖这些区间要求线段长度最短,然后输出这些线段的端点。
jia_xiaoxin 2008-11-10
  • 打赏
  • 举报
回复
楼主的区间覆盖问题最好给一个详细的描述
一般对于区间覆盖的问题,都采用线段树和动态规划的算法来求解。
太乙 2008-11-10
  • 打赏
  • 举报
回复
#include <iostream> 
#include <stdlib.h>

using namespace std;
int a=0,b=0,c=0,d=0;
const int size=200;
void sort(int value[],int nNumber)
{
for(int i=0;i <nNumber-1;i++)
for(int j=0;j <nNumber-1-i;j++)
if(value[j] <value[j+1])
{
int temp=value[j];
value[j]=value[j+1];
value[j+1]=temp;
}
}
int main(int argc, char *argv[])
{
int M=0;
int position[size];
cout <<"请输入要覆盖的区间总数M=";
cin>>M;
cout <<"请输入" <<M <<"个要覆盖的区间:" <<endl;
int i=0;
for(i=0;i <M;i++)
cin>>position[i];
sort(position,M);
int distance[size-1];
for(i=0;i <M-1;i++)
distance[i]=position[i+1]-position[i]-1;
sort(distance,M-1);
int N=1;
cout <<"请输入可用线段总数N=";
cin>>N;
if(N>M)
{
cout <<"最小线段总长" <<M <<endl;
for(i=0;i <5;i++)
cout <<"端点" <<i <<position[i]-1 <<"->" <<position[i] <<" ";
return 1;
}
int nline =1;
int ntotlelength=position[0]-position[M-1]+1;
int ndivide=0;
while((nline <N)&&(distance[ndivide]>0))
{
nline++;
ntotlelength-=distance[ndivide];
ndivide++;
}
cout <<"最小线段总长" <<ntotlelength <<endl;
for(i=0;i <M;i++)
{
if(position[i+1]-position[i]-1==3)
{
cout <<position[i];
cout <<position[i+1]-1;
}
if(position[i+1]-position[i]-1==2)
{
cout <<position[i];
cout <<position[i+1]-1;
}
}

system("PAUSE");
return 0;
}


稍微解释一下题目@!!!!!!

太乙 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 a497332345 的回复:]
M输入5
输入1 3 5 7 11
N输入3
就这个意思
[/Quote]

汗~~~~~~就是说有5个区间,分别是
第一个区间长度1 
第二个区间长度3 
第三个区间长度5 
第四个区间长度7 
第五个区间长度11

然后呢,用3条线段去覆盖

我的意思是怎么去覆盖???


给个正确的输出啊!!

fdg个sggggg 2008-11-10
  • 打赏
  • 举报
回复
M输入5
输入1 3 5 7 11
N输入3
就这个意思
fdg个sggggg 2008-11-10
  • 打赏
  • 举报
回复
M输入5
输入1 3 5 7 11
N输入3
就这个意思
fdg个sggggg 2008-11-10
  • 打赏
  • 举报
回复
M输入5
输入1 3 5 7 11
N输入3
就这个意思
太乙 2008-11-10
  • 打赏
  • 举报
回复
lz能不能给个正确的例子,比如输入多少,应该输出多少,不明白lz那个题目意思!!
zwd2005 2008-11-10
  • 打赏
  • 举报
回复
N个线段,那就找出N-1个最大gap

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧