題目:node
i表示x座標軸上座標爲(i-1,i),長度爲1的區間,給出n個這樣的區間,要求畫出m條線段覆蓋住全部的區間,每條線段能夠任意長,要求全部的線段長度和最小ios
第一行輸入n和m,其中1<=n<=200,1<=m<=50spa
第二行輸入n個座標code
思路:blog
我先用一條線段從起點拉到終點,將全部的區間都覆蓋到,題目要求能夠用m段而且和要最小,那我就將這一條線段從中間剪成m段,即剪m-1次排序
若是要想達到和最小的目的,那我每次剪開的地方必定要是最長的,我能夠將全部空白的區間按長度遞減排序,取前m-1個剪掉便可。ci
上代碼:it
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 #define MAX 205 5 using namespace std; 6 //此結構體用來記錄空白段 7 struct Node { 8 int b;//起始座標 9 int e;//結束座標 10 int len;//空白段長度 11 bool operator<(const Node &s)const { 12 return len > s.len;//長度按遞減排序 13 } 14 }; 15 Node node[MAX]; 16 int k = 0; 17 int main() { 18 int n; 19 int m; 20 int a[MAX]; 21 cin >> n >> m; 22 vector<int> v; 23 for (int i = 0; i < n; i++) { 24 cin >> a[i]; 25 v.push_back(a[i]); 26 } 27 sort(v.begin(), v.end()); 28 vector<int>::iterator it; 29 for (it = v.begin(); it != v.end()-1; it++) { 30 node[k].b = (*it); 31 node[k].e = *(it + 1)-1; 32 node[k].len = node[k].e - node[k].b; 33 k++; 34 } 35 int sum = 0; 36 sum = node[k - 1].e + 1 - node[0].b + 1; 37 sort(node, node + k); 38 for (int i = 0; i < k; i++) { 39 cout << node[i].b<<" "<<node[i].e<<" "<<node[i].len<<endl; 40 } 41 for (int i = 0; i < m - 1; i++) { 42 sum -= node[i].len; 43 } 44 cout << sum; 45 46 return 0; 47 }