區間覆蓋問題。數軸上有n個閉區間[a先進行預處理,將不包含[si,bi
] ,選擇盡量少的區間覆蓋一條指定線段[s
,t] 。
,t] 的區間都去掉,然後再按左區間從小到大排序。如果最小區間的左區間大於
s 的話,則無解。選取包含
s的右區間最大的區間,該區間的右區間仍然小於下乙個區間的左區間,則無解。按照這樣的方法一直選擇到最後乙個區間,如果最後乙個區間的右區間小於
t ,則無解。否則輸出所有區間。
// 區間資料結構
struct region
};// 貪心法
// 區間覆蓋問題
void region(region *r, int n, region target)
re[num++] = r[i];
}// 區間是否覆蓋完全
int iscover = 1;
// 處理後無區間
if(!num)
// 按左區間大小從小到大排序
sort(re, re + num);
// 當前最大區間
region curmax = re[0];
// 記錄覆蓋區間
vector
coverr;
// 處理覆蓋最左邊的問題
if(curmax.left > target.left)
// 處理覆蓋中間問題
for(int i = 1; i < num; i++)
// 覆蓋右區間比當前最大區間大,且還能覆蓋到目標區間左區間
if(re[i].right > curmax.right && re[i].left <= target.left) else
if(re[i].left > target.left) }}
// 處理覆蓋最右邊的問題
if(curmax.right < target.right) else
// 輸出
if(iscover)
cout
<< "區間總數為:"
<< coverr.size() << endl << endl;
} else
}
#include
#include
#include
using
namespace
std;
// 區間資料結構
struct region
};// 貪心法
// 區間覆蓋問題
void region(region *r, int n, region target)
re[num++] = r[i];
}// 區間是否覆蓋完全
int iscover = 1;
// 處理後無區間
if(!num)
// 按左區間大小從小到大排序
sort(re, re + num);
// 當前最大區間
region curmax = re[0];
// 記錄覆蓋區間
vector
coverr;
// 處理覆蓋最左邊的問題
if(curmax.left > target.left)
// 處理覆蓋中間問題
for(int i = 1; i < num; i++)
// 覆蓋右區間比當前最大區間大,且還能覆蓋到目標區間左區間
if(re[i].right > curmax.right && re[i].left <= target.left) else
if(re[i].left > target.left) }}
// 處理覆蓋最右邊的問題
if(curmax.right < target.right) else
// 輸出
if(iscover)
cout
<< "區間總數為:"
<< coverr.size() << endl << endl;
} else
}int main()
// 需要覆蓋的線段區間
region target;
cout
<< "需要覆蓋的線段區間為:";
cin >> target.left >> target.right;
region r[n];
for(int i = 0; i < n; i++)
cout
<< "最少區間能覆蓋線段區間["
<< target.left << ","
<< target.right <<"]組合和總數為:"
<< endl;
region(r, n, target);
}return
0;}
請輸入閉區間的數量(0退出):5
需要覆蓋的線段區間為:5 10
第1個閉區間(x,y)為:1 3
第2個閉區間(x,y)為:3 6
第3個閉區間(x,y)為:5 7
第4個閉區間(x,y)為:7 9
第5個閉區間(x,y)為:8 11
最少區間能覆蓋線段區間[5,10]組合和總數為:
區間:(5,7)
區間:(7,9)
區間:(8,11)
區間總數為:3
請輸入閉區間的數量(0退出):3
需要覆蓋的線段區間為:5 9
第1個閉區間(x,y)為:1 3
第2個閉區間(x,y)為:1 4
第3個閉區間(x,y)為:2 3
最少區間能覆蓋線段區間[5,9]組合和總數為:
無解。請輸入閉區間的數量(0退出):3
需要覆蓋的線段區間為:5 9
第1個閉區間(x,y)為:10 11
第2個閉區間(x,y)為:12 13
第3個閉區間(x,y)為:14 15
最少區間能覆蓋線段區間[5,9]組合和總數為:
無解。請輸入閉區間的數量(0退出):5
需要覆蓋的線段區間為:5 9
第1個閉區間(x,y)為:6 7
第2個閉區間(x,y)為:7 8
第3個閉區間(x,y)為:8 9
第4個閉區間(x,y)為:9 10
第5個閉區間(x,y)為:10 11
最少區間能覆蓋線段區間[5,9]組合和總數為:
無解。請輸入閉區間的數量(0退出):5
需要覆蓋的線段區間為:5 9
第1個閉區間(x,y)為:1 5
第2個閉區間(x,y)為:5 6
第3個閉區間(x,y)為:5 7
第4個閉區間(x,y)為:8 9
第5個閉區間(x,y)為:9 10
最少區間能覆蓋線段區間[5,9]組合和總數為:
無解。請輸入閉區間的數量(0退出):5
需要覆蓋的線段區間為:5 9
第1個閉區間(x,y)為:1 5
第2個閉區間(x,y)為:5 6
第3個閉區間(x,y)為:5 7
第4個閉區間(x,y)為:5 8
第5個閉區間(x,y)為:6 7
最少區間能覆蓋線段區間[5,9]組合和總數為:
無解。請輸入閉區間的數量(0退出):0
process
returned 0 (0x0) execution
time : 172.044
spress
anykey
tocontinue.
貪心法 區間完全覆蓋問題
問題 區間完全覆蓋問題 問題描述 給定乙個長度為m的區間,再給出n個區間的起點和終點,求最少使用多少個區間可以將整個區間完全覆蓋。方法 先將n個區間按照起點進行遞增排序。令s表示已經覆蓋到的區域。再剩下的區間中找出所有左端點小於等於當前已經覆蓋到的區域s並且右端點大於等於s的區間,取右端點最大的區間...
區間覆蓋問題 逆向貪心法簡單
problem description 用i來表示x座標軸上座標為 i 1,i 的長度為1的區間,並給出n 1 n 200 個不同的整數,表示n個這樣的區間。現在要求畫m條線段覆蓋住所有的區間,條件是 每條線段可以任意長,但是要求所畫線段的長度之和最小,並且線段的數目不超過m 1 m 50 inpu...
貪心 區間覆蓋問題
區間覆蓋問題 time limit 1000ms memory limit 65536kb submit statistic discuss problem description 設x1 x2 xn 是實直線上的n 個點。用固定長度的閉區間覆蓋這n 個點,至少需要多少個這樣的固定長度閉區間?對於給...