程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 山東理工大學OJ 2074 區間覆蓋問題

山東理工大學OJ 2074 區間覆蓋問題

編輯:C++入門知識

題目描述  用i來表示x坐標軸上坐標為[i-1,i]的長度為1的區間,並給出n(1≤M≤200)個不同的整數,表示n個這樣的區間。 現在要求畫m條線段覆蓋住所有的區間, 條件是:每條線段可以任意長,但是要求所畫線段的長度之和最小, 並且線段的數目不超過N(1≤N≤50)。   輸入  輸入包括多組數據,每組數據的第一行表示點n,和所需線段數m,後面的n行表示點的坐標 輸出  輸出每組輸出占一行表示線段的長度。 示例輸入 5 3 1 3 5 8 11 示例輸出 7 提示   來源   示例程序     思路:  先把總的線的長度求出來  即從第一個線段的起點到最後一個線段的終點的長度sum,  然後求出每2個區間之間的距離a[i]   之後用sum減去m-1個最大的a[i]  相當於把整條線分成了m份 [cpp]  #include<stdio.h>   #include<algorithm>   using namespace std;   int main()   {       int val[300],i, n, m, sum, dis[300];       while(~scanf("%d %d", &n, &m))       {           for(i = 0; i < n; i++)               scanf("%d",&val[i]);           std::sort(val, val+n);           for(i = 0; i < n - 1; i++)               dis[i] = val[i+1] - val[i] - 1;           std::sort(dis, dis+n-1);           sum = val[n-1] - val[0] + 1;           int j = n - 2;           for(i = 1; i < m && i < n; i++)               sum -= dis[j--];           printf("%d\n",sum);       }       return 0;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved