數軸上有n個區間[ai,bi],選擇盡量少的區間覆蓋一條指定線段[s,t]。
貪心策略:
把各區間按照a從小到大排序,從前向後遍歷,然後每次選擇從當前起點s開始的最長區間,並以這個區間的右端點為新的起點,繼續選擇,直到找不到區間覆蓋當前起點s或者s已經到達線段末端。
需要注意的是,如果某一區間邊界大於s,t的邊界,應把它們變成s或t。因為超出的部分毫無意義,同時還會影響對資料的分析。
附**。
#include
#include
#include
using namespace std;
struct qujian
float a,b;
bool cmp(const qujian& s1,const qujian& s2)
return s1.a < s2.a;
int main()
qujian a[10005];
int z,n,w,h,x,r,cnt;
float start,l,__h;
scanf("%d",&z);
while(z--)
scanf("%d%d%d",&n,&w,&h);
cnt = start = 0;
__h = h*h*1.0/4;
for(int i=0;i
scanf("%d%d",&x,&r);
if(r*r < __h)
i--;n--;
continue;
l = sqrt(r*r - __h);
a[i].a = x-l > 0 ? x-l : 0;
a[i].b = x+l < w ? x+l : w;
sort(a,a+n,cmp);
int i,k = -1;
while(start < w && a[k+1].a <= start)
float mmax = -1;
for(i = k+1;a[i].a <= start && i
if(mmax < a[i].b)
mmax = a[i].b;
k = i;
start = mmax;
cnt++;
printf("%d\n",start
return 0;
貪心 區間覆蓋問題
區間覆蓋問題 time limit 1000ms memory limit 65536kb submit statistic discuss problem description 設x1 x2 xn 是實直線上的n 個點。用固定長度的閉區間覆蓋這n 個點,至少需要多少個這樣的固定長度閉區間?對於給...
區間貪心問題小結(區間選點,區間覆蓋,區間選取)
貪心演算法 思想 什麼是貪心演算法,什麼算得上是貪心 貪心演算法 又稱貪婪演算法 是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,只做出在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性...
貪心問題 區間選點以及區間覆蓋
乙個整數,代表選點的數目 215 461313 2546 2將區間按照右端點降序排序,如果右端點一樣的話,則左端點降序排序。排序完成後,先選擇第乙個區間的右端點,判斷該點與下乙個區間的關係,找到下乙個不包含該點的區間,再次選擇下乙個區間的右端點,以此類推,直到迴圈判斷完所有的區間,得到最終的點數。i...