C语言 贪心 区间覆盖问题

女爷i 2022-06-01 08:08 352阅读 0赞

区间覆盖问题

Time Limit: 1000MS Memory Limit: 65536KB

Submit Statistic

Problem Description

用i来表示x坐标轴上坐标为[i-1,i]的长度为1的区间,并给出n(1≤n≤200)个不同的整数,表示n个这样的区间。

现在要求画m条线段覆盖住所有的区间,

条件是:每条线段可以任意长,但是要求所画线段的长度之和最小,

并且线段的数目不超过m(1≤m≤50)。

Input

输入包括多组数据,每组数据的第一行表示区间个数n和所需线段数m,第二行表示n个点的坐标。

Output

每组输出占一行,输出m条线段的最小长度和。

Example Input

  1. 5 3
  2. 1 3 8 5 11

Example Output

  1. 7
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int n, m, j, t;
  6. while(scanf("%d%d", &n, &m) != EOF)
  7. {
  8. int i, s[300];
  9. int d[300];
  10. for(i = 0; i < n; i++)
  11. {
  12. scanf("%d", &s[i]);
  13. }
  14. for(i = 0; i < n - 1; i++)
  15. {
  16. for(j = 0; j < n - 1 - i; j++)
  17. {
  18. if(s[j] < s[j + 1])
  19. {
  20. t = s[j];
  21. s[j] = s[j + 1];
  22. s[j + 1] = t;
  23. }
  24. }
  25. }
  26. for(i = 0; i < n - 1; i++)
  27. {
  28. d[i] = s[i] - s[i + 1] - 1;
  29. }
  30. for(i = 0; i < n - 2; i++)
  31. {
  32. for(j = 0; j < n - 2 - i; j++)
  33. {
  34. if(d[j] < d[j + 1])
  35. {
  36. t = d[j];
  37. d[j] = d[j + 1];
  38. d[j + 1] = t;
  39. }
  40. }
  41. }
  42. int count = 1;
  43. i = 0;
  44. int sum = s[0] - s[n - 1] + 1;
  45. while(count < m && d[i] > 0)
  46. {
  47. count++;
  48. sum -= d[i];
  49. i++;
  50. }
  51. printf("%d\n", sum);
  52. }
  53. return 0;
  54. }

发表评论

表情:
评论列表 (有 0 条评论,352人围观)

还没有评论,来说两句吧...

相关阅读

    相关 区间覆盖贪心

    题目描述 给定N个闭区间\[ai,bi\]以及一个线段区间\[s,t\],请你选择尽量少的区间,将指定线段区间完全覆盖。 输出最少区间数,如果无法完全覆盖则输出-1。

    相关 区间覆盖问题

    1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间

    相关 区间覆盖问题

    Problem Description 用i来表示x坐标轴上坐标为\[i-1,i\]的长度为1的区间,并给出n(1≤n≤200)个不同的整数,表示n个这样的区间。 现在要求

    相关 区间覆盖问题

    Problem Description 用i来表示x坐标轴上坐标为\[i-1,i\]的长度为1的区间,并给出n(1≤n≤200)个不同的整数,表示n个这样的区间。 现在