目录
前言
题目介绍
解决思路:
贪心策略:
理论存在,实践开始!
全部代码如下:
总结:
Love is worth years.❤热爱可抵岁月漫长。
前言
区域覆盖问题!!!!!!!!!!!!!!!!!!!!!!!!!不用我多说了吧!!
题目介绍
解决思路:
怎么做呢??很简单了!
贪心策略:
我们把他们每个之间的距离从大到小排列,每用一个线段,抵消一个大距离,最后用线段换距离
最后用总长减去换去的距离就是我们想要找到的!!!
理论存在,实践开始!
全部代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66#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.❤内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复