貪心法 區間覆蓋問題

2021-07-13 01:57:03 字數 3795 閱讀 5347

區間覆蓋問題。數軸上有n個閉區間[a

i,bi

] ,選擇盡量少的區間覆蓋一條指定線段[s

,t] 。

先進行預處理,將不包含[s

,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 個點,至少需要多少個這樣的固定長度閉區間?對於給...