在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以縱座標並不重要,因此只要知道開始和結束的橫座標就足夠了。開始座標總是小於結束座標。
一支弓箭可以沿著 x 軸從不同點完全垂直地射出。在座標 x 處射出一支箭,若有乙個氣球的直徑的開始和結束座標為 xstart,xend, 且滿足 xstart ≤ x ≤ xend,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。 弓箭一旦被射出之後,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。
6
10 16 2 8 1 6 7 12
2
解釋:對於該樣例,x = 6 可以射爆 [2,8],[1,6] 兩個氣球,以及 x = 11 射爆另外兩個氣球
注意測試資料
1
-2147483648 2147483647
首先按照氣球尾部大小從小到大排序
迴圈開始從第乙個氣球的尾部射出一箭,即k = b[i].end-1
;
然後從最後乙個被射穿的氣球後乙個開始迴圈,即b[i].start>=k
這樣能保證每次射穿的氣球是最多的,即需要的弓箭是最少的。
#include #include using namespace std;
struct balloon;
balloon *b;
bool cmp(balloon t1,balloon t2)
sort(b,b+n,cmp);
int sum = 0;
int k = -1<<31;
for (int i = 0; i < n; ++i)
}cout
}
用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
用最少數量的箭引爆氣球
思考 首先將樣例畫圖,找出規律理解題意,其次舉例子,1個氣球最少用1個箭,2個重疊氣球最少用乙個箭,3個重疊氣球最少用乙個箭 因此,盡量使氣球重疊部分最多一些,那麼如何演算法化呢?當然是排序,然後遍歷維護射擊區間。1,排序,按照左端點。2,遍歷氣球陣列,維護乙個設計區間,初始化就是第乙個氣球的區間,...