飛彈攔截工具每次只能攔截不大於前一次高度的飛彈。
給一組飛彈的資料,問:一次使用該工具最多能攔截多少飛彈,最少使用多少該工具能攔截全部飛彈。
一問:仔細思考後發現是最長不上公升子串行問題,採用lis的解法
二問:想要攔截所有飛彈,不妨想後乙個飛彈高度要小於或者等於前乙個飛彈可以全部攔截,若出現後乙個飛彈高於前乙個。
我的理解的改變:1.後乙個高於前乙個就加乙個工具使用,該思路明顯錯誤,因為後乙個可能可以被前面使用過的工具攔截。
轉化為lis,即求最長上公升子串行,為什麼不是最長不下降子串行?因為其中子串行的每乙個元素都代表著一段不上公升子串行的終點
而lis 時間複雜度為n的解法,簡單來說就是用乙個單調序列來儲存,用二分來尋找和替換
lower_bound(begin,end,&val,greater())-begin
範圍[begin,end)
lower_bound等號時取到,upper表示等號時 取不到
預設是非遞減序列的大於(等於)val的位址
加入greater()就變為小於(等於)
若begin,end化成rbegin,rend,即反方向迭代,同理也要減rbegin(),
#includeusing namespace std;
#define fi first
#define se second
#define pb push_back
#define endl '\n'
#define debug(x) cout<<"------"<=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(0);
typedef pair pii;
typedef vector vi;
const int mod = 1e9+7;
const int inf =0x3f3f3f3f;
const int n=100001;
int b[n];
mapma;
vi goal;
vi tar;
int ans=-inf;
void solve()
int len=1;
goal.pb(0);
goal.pb(b[1]);
rep(i,2,cnt-1)
else
}tar.pb(0);
tar.pb(b[1]);
int len0=1;
rep(i,2,cnt-1)
else
}cout
寒假集訓搜尋專題
hdu1016素數環 給定n,0 1 需要先製作素數表,因為n在20以內,所以環中兩數相加小於40,素數表判斷到39即可 2 dfs求解,在乙個點中可以選用的數滿足 在給定n範圍內,與前乙個數相加為素數,沒有被選用過 需要注意開始的節點1是固定的,應該在dfs前判斷為已經走過或者dfs中永不遍歷數字...
TS寒假集訓線段樹專題B題
ts寒假集訓線段樹專題b題 對於任意乙個序列因為數字全是從0 n 1,所以我們發現對於任意x都有x個比他小的數n 1 x個比他大的數,所以當吧x從隊頭移到隊尾是就會增加n 1 x x個逆序。根據以上發現我們可以遞推的算出n個序列的逆序數代價是on。而求乙個序列逆序數的暴力演算法是n方的於是乎看見50...
寒假集訓二補題與題解
統計字首個數,一想到字串的字首,我們就應該想到字典樹,這個和字典一樣的字首樹.這道題目是字典樹模板的略微改動,我們發現這道題目和一般字典樹的查詢不一樣,字典樹一般查詢是看這個字串是否出現,而這道題目這是統計這個字串出現的次數.includeusing namespace std const int ...