概述
目录
前言
题目介绍
解决思路:
贪心策略:
理论存在,实践开始!
全部代码如下:
总结:
Love is worth years.❤热爱可抵岁月漫长。
前言
区域覆盖问题!!!!!!!!!!!!!!!!!!!!!!!!!不用我多说了吧!!
题目介绍
解决思路:
怎么做呢??很简单了!
贪心策略:
我们把他们每个之间的距离从大到小排列,每用一个线段,抵消一个大距离,最后用线段换距离
最后用总长减去换去的距离就是我们想要找到的!!!
理论存在,实践开始!
全部代码如下:
#include <stdio.h>
void sort (int *a,int *b,int n);
void sort (int *a,int *b,int n)
{
int i,j,t,tt;
for (i=0;i<n-1;i++)
{
for (j=0;j<n-1-i;j++)
{
if(a[j]<=a[j+1])
{
t=a[j];a[j]=a[j+1];a[j+1]=t;
t=b[j];b[j]=b[j+1];b[j+1]=t;
}
}
}
}//不必多说,冒泡排序降序。
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))//输入包括多组数据,区间个数n(1≤n≤200) 使用线段数m(1≤m≤50)。
{
int end[n];//区间结束
int start[n];//区间开始
int dis[n-1];//区间间隔
int i;
int mmm[200]={1};//忽略它
for (i=0;i<n;i++)
{
scanf("%d",&end[i]);
start[i]=end[i]-1;
}
sort(start,end,n);//按照开始节点排序
for (i=0;i<n;i++)
{
dis[i]=start[i]-end[i+1];//计算并储存间隔
}
int al=end[0]-start[n-1];//长度和因为我们降序排列的所以第一个的end-最后一个的start就是长度和
sort(dis,mmm,n-1);//按照间隔大小降序排序
if(m > n){printf("%d",n);return 0;}//可以不写如果使用的线段数比这个线段数还多的话,那肯定直接输出每个线段的总长度是最短的
int nl=1;//计数器(使用线段)
int node=0;//计数器(距离)
while (nl<m && dis[node]>0)
{
nl++;
al=al-dis[node];
node++;//再用一个线段将第一个大距离分开使长度最短以此类推达到目的
}
printf("%dn",al);
}
return 0;
}
总结:
1.制定好适合的贪心策略
2.用总长减去使用的距离
3.专心写代码,代码里有注释解析哦!!
Love is worth years.❤
热爱可抵岁月漫长。
最后
以上就是酷酷星星为你收集整理的区间覆盖问题Love is worth years.❤ 热爱可抵岁月漫长。的全部内容,希望文章能够帮你解决区间覆盖问题Love is worth years.❤ 热爱可抵岁月漫长。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复