日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Minimal coverage (贪心,最小覆盖)

發布時間:2023/12/13 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Minimal coverage (贪心,最小覆盖) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

題目大意:先確定一個M, 然后輸入多組線段的左端和右端的端點坐標,然后讓你求出來在所給的線段中能夠

[0, M]?區域完全覆蓋完的最少需要的線段數,并輸出這些線段的左右端點坐標。

?

思路分析:

? ? ? ?線段區間的起點是0,那么找出所有區間起點小于0中的最合適的區間。

? ? ? ?因為需要盡量少的區間,所以選擇右端點更大的區間,它包含所選線段更大。

? ? ? ?如果在所有區間中找到了解,且右端點小于M,則把找到的區間的右端點定為新的線段區間的起點。

1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 7 8 using namespace std; 9 10 struct node 11 { 12 int L, R; 13 }a[100010], b[100010]; 14 15 bool cmp(node a, node b) 16 { 17 return a.R > b.R; 18 } 19 20 int main() 21 { 22 int M; 23 while(scanf("%d", &M) != EOF) 24 { 25 int Index = 0; 26 while(1) 27 { 28 scanf("%d%d", &a[Index].L, &a[Index].R); 29 if(a[Index].L == 0 && a[Index].R == 0) 30 break; 31 ++Index; 32 } 33 34 sort(a, a+Index, cmp); 35 36 int border = 0; // 起始邊界點為0 37 int cnt = 0; 38 while(border < M) 39 { 40 int i = 0; 41 for(; i < Index; ++i) 42 { 43 // a[i].R >= border提交將會Runtime error 44 if(a[i].L <= border && a[i].R > border) 45 { 46 b[cnt] = a[i]; 47 cnt++; 48 border = a[i].R; // 更新邊界點 49 break; 50 } 51 } 52 if(i == Index) 53 break; 54 } 55 56 57 if(border < M) 58 cout << "No solution" << endl; 59 else 60 { 61 cout << cnt << endl; 62 for(int i = 0; i < cnt; ++i) 63 cout << b[i].L << " " << b[i].R << endl; 64 } 65 } 66 67 return 0; 68 }

?

轉載于:https://www.cnblogs.com/FengZeng666/p/11120095.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Minimal coverage (贪心,最小覆盖)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。