時間限制: 1 sec
記憶體限制: 128 mb
提交: 44
解決: 16 [
提交][
狀態][
討論版]
蓋倫和趙信這對**又在打賭,誰輸了就去向卡特琳娜告白。。
這一季中蓋倫一如既往的慫。趙信為了幫他一把,故意表現出很厲害的樣子,結果成功啟用了蓋倫的智商。
趙信手中有n張牌,每張牌上面有乙個數,這些牌是非遞減的。現在蓋倫從他手中抽取k張牌,如果蓋倫抽取後剩下的牌中相鄰兩張的差值的最大值最小,就算他贏。
結果當然是蓋倫贏了。那麼問題來了!
第一行兩個正整數n和k。
第二行n個數代表n張牌。
3≤n≤10
51≤k≤n-2
-109≤a
i≤109
輸出只有乙個數,上述中的最小值。
5 11 2 4 7 8
8 21 2 3 5 8 13 17 18
5 11 2 4 6 9
352
題意:有一非遞減序列a,要隨意抽掉k個數字,剩下n-k個數為序列b,問序列b的相鄰元素的差值最大值,最小是多少。
思路:我剛看到這題就想著什麼最大值最小化,確實是啊,但是不是用二分的;先思考給定的序列為非遞減序列,那麼相鄰的元素之間的差才會更小,如果從中間去掉的話,就會擴大相鄰兩數之間的差值,所以最優是一次抽掉的k個數是相連的;我們再求剩下的區間的相鄰元素差(預處理)的最大值,然後對最大值比較取最小,最後得到的minn就是最小值了;多組資料輸入,在這兒wa了好幾發;
**:
#include#include#includeusing namespace std;
const int n=100005;
const int inf=1000000007;
int a[n];
struct node
} tree[n<<2];
void buildtree(int l,int r,int rt)
int m=tree[rt].mid();
buildtree(l,m,rt<<1);
buildtree(m+1,r,rt<<1|1);
tree[rt].val=max(tree[rt<<1].val,tree[rt<<1|1].val);
}int query(int l,int r,int rt)
int main()
printf("%d\n",minn);
}return 0;
}
nyoj 士兵殺敵(一) 108 (線段樹)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍現在想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。注意,南將軍可能會問很多次問題。輸入 只有一組測試資料 第一行是...
NYOJ116 線段樹 樹狀陣列
題目傳送門 戳一戳 注意陣列大小,一般我們用線段樹,都開四倍空間。但是這道題資料量是一百萬,四倍開不了 所以我們就不能開四倍,而要計算一下空間,避免浪費。計算方法就是 1000000 找到2的n次方剛好大於一百萬的那個數 就是2的20次方是1048576 然後再拿1048576 x 2 209715...
nyoj 最大最小值 1185 線段樹
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 給出n個整數,執行m次詢問。對於每次詢問,首先輸入三個整數c l r 如果c等於1,輸出第l個數到第r個數之間的最小值 如果c等於2,輸出第l個數到第r個數之間的最大值 如果c等於3,輸出第l個數到第r個數之間的最小值與最大值的...