2日目()

2日目

二部

説明

また、バイナリサーチバイナリサーチ(バイナリ検索)として知られている、それは高い効率的な検索手法です。しかし、バイナリ検索が注文したキーワードでリニアテーブル必見順次記憶構造を必要とし、テーブル内の要素。

例:

昨日の試験T2は、神々の70ポイントですYRQ

優位

暴力に対するバイナリ列挙が懸念され、有意に少ない数決定
Jutilaishuo所望列挙暴力はO(N)倍である場合には、
これだけ半分必要O(logN個)時間が答えであると

:一般的に、我々は次のような場合には半分を使用する
ゼロの単調関数を求める
杭の需要が最大数の最小値である
直接答えを算出することは困難ですが、答えは法的良い判断ではありません

実装コード

while(r-l>eps)
{
    mid=(l+r)/2;
    if(f(mid)>0) r=mid;
    else l=mid;
}
while(l<r)
{
    mid=(l+r)/2;
    if(f(mid)>0) r=mid;
    else l=mid+1;
}

パイ

我的生日要到了!根据习俗,我需要将一些派分给大家。我有N个不同口味、不同大小的派。有F个朋友会来参加我的派对,每个人会拿到一块派(必须一个派的一块,不能由几个派的小块拼成;可以是一整个派)。
我的朋友们都特别小气,如果有人拿到更大的一块,就会开始抱怨。因此所有人拿到的派是同样大小的(但不需要是同样形状的),虽然这样有些派会被浪费,但总比搞砸整个派对好。当然,我也要给自己留一块,而这一块也要和其他人的同样大小。
请问我们每个人拿到的派最大是多少?每个派都是一个高为1,半径不等的圆柱体。
取得するために皆のためのパイの半分のサイズについて

それぞれの人が知られているので、その後、再びNキャンプの全体スイープ、キャンプのサイズは、その後、最初のカットあたりのブロックの数も知って送ることができるでしょう
これらのポイントを送信することが十分にテストを
十分な人々がそれぞれの派閥の記述を取る場合あまりにも、小さな半分に
一人一人の十分な説明も大きな半分に、より多くのパイを得ることができる可能性がある場合

最大値を最小化

把一个包含n个正整数的序列划分为m个连续的子序列(每个正整数恰好属于一个序列)。设第i个序列的各数之和为S(i),你的任务是让所有S(i)的最大值尽量小。
例如序列1 2 3 2 5 4划分成3个序列的最优方案为1 2 3|2 5 |4,其中S(1)、S(2)、S(3)分别为6、7、4,最大值为7;如果划分成1 2|3 2|5 4,则最大值为9,不如刚才的好。
n<=10^6,所有数之和不超过10^9。
最大数であるものの前半

この値は、各セグメントの合計の上限である
と欲が、私たちは、これらの数字は、しばらくの間、アップになるだろう、あなたはまで追加できなくなるまで、この制限内で合計限り、バックの内側に数字を追加していく
部門で、Saowanすべての数字の後を見て段落は、
セグメント> Mの数は、説明の最大値が小さすぎる場合には、L =ミッド+ 1つの大きくなければならない
、さもなければも記載最大値が小さい、R =半ばになることが

排水池

公园里有n个水塘,需要把这n个水塘中的水排干,水塘中的水在自然条件下1个单位的时间可以蒸发A升水。现在买了1台抽水机,使用抽水机可以让你用1个单位的时间使每个水塘除开自然蒸发的A升水外,还可抽B升水,但在1个单位的时间内只能对1个水塘使用。
要你求出排干所有水塘的最少时间(水塘中的水为0时为排干)。

N-公園の池、これは必要とn個の池の水は、自然条件の下で、単位時間は、保険料を蒸発させることができる、プール内の水を排水。今のポンプの1セットを購入し、ポンプの使用はなく、唯一のユニット内の時間のために、あなたは自然蒸発池Aプレミアムに加えているので、各単位時間を使用することができますが、また、Bの保険料をポンプ池を使用。
あなたは、すべての池は、(池の水の中に0に排出される)最小時間を排水見つけたいです。

半分の時間Tは、それぞれマイナスに池が蒸発した後、水の残りの部分をbで割って、最終的にこの時点で見てはTよりも大きいです 説明小さなTよりも大きく、逆に、大T.

配列のN積小さな要素の

给出两个长度为n的数组A和B, 在A和B中各任取一个, 可以得到n×n个积. 求第m小的元素。
n<=100000

あなた自身を書きます

AI、BI = X / AIかどうかを確認を決定

すべての数より少ないバイ追加アップの数より

次のAIを探し

結合されました

X / <愛B1まで

ああそのような何か。

複雑\(O(N ^ 2 \ nはログ)\)

そこの最適化

小規模から大規模なために:

である:私は、のように大きくなる(\ \ {a_iをFRAC {X}} \)小さくなり、即ち、の要件を満たす(B_i \)は\小さくなります。添え字bのそれぞれに設けられ\(y_j \)次に、\(y_jが\)減少

1からnまで、レコードYへのポインタを取得し、すべてのI一度更新され、Yが満足するように低減される\(a_iを\回b_y <= X \) 最大値を、そのような複雑さは、\(O(N \ログN-)\)

コード

bool check(int x){
    int ans = 0;
        int cnt = n;
    for(int i = 1;i <= n; i++){
                while(x/b[cnt] > a[i]) cnt--;
        ans += cnt;
    }
    return ans == mid;
}

石をスキップ!

ハーフ答え。私はそれを言うために戻って書きました

01スコアプラン!

Poj2728
あなたの[i]と[i]はBのコスト、そして我々は、NK商品を選出、合計値/最大合計対価の価値を与える:旨の。

ようなバイナリ応答X、条件が満たされている見つけ、
\ [\ FRAC {\和a_iを
} {\和b_i} = X \\ \和a_iを= X \回\和b_i \\ \] 次に、C [i]とが存在してもよいですアレイ、例えばその
\ - [C_I = a_iをX \
回b_i \] 際に必要正当であれば、最終的な
\ [\和C_I = 0 \ ]

bool check(int x)
{
    for(int i=1;i<=n;++i)
        c[i]=a[i]-b[i]*x;
    sort(c+1,c+1+n);
    int sum=0;
    for(int i=1;i<=k;++i)
        sum+=c[i];
    return sum<=0;
}
int main()
{
    int l,r;
    while(l<=r)
    {
        int mid=l+r>>1;
        if(check(mid))ans=mid,r=mid+1;
        else l=mid+1;
    }//可以开一个ans不用后续找答案 
    return 0;
}

砂漠の王

画像-20200117093907781

体重が設けられており、\(= a_iをcost_i - len_i \) 最小スパニングツリーを見つけます。

分割統治アルゴリズム

説明

分割統治は「分割統治」であります

グローバルは、ローカルになってから、彼は徐々に問題の規模を削減、複雑な問題の簡素化を置くことができ、より効率的な問題解決

効率的

クイックソート(+パーティションバブルソート)

マージソート(標準パーティション)

以下からの時間のパーティションの考え方を持つすべての\(O(N ^ 2) \) となり\(O(N \ Nログ )\)

計算の複雑

主定理

画像-20200117095159375

実際には、ツリーラインと同じバー。それは二回、ツリーラインでなければなりません。

逆にするには

彼は上の偉大だったのリンク

最初に考えて、その後、このアイデアを見てみましょう。

直接暴力求的话,显然时间复杂度是不可接受的
我们不妨转换一下,分而治之
把整个数列劈成两半
则总的逆序对数量=左半部分逆序对数量+右半部分逆序对数量+左边的数比右边大的对数
前两项我们可以递归求解,最后一项我们可以在归并排序的同时稍加处理,O(N)计算出来
这样时间复杂度与归并排序一样,都是O(NlogN)的
//手糊一下
void msort(int l,int r){
        if(l == r) return;
    int mid = (l + r) >> 1;
    msort(l,mid);
    msort(mid+1,r);
    int x = l,y = mid+1;
    int cnt = l;
    while(x <= mid && y <= r){
                while(a[x] < a[y] && x <= mid) d[cnt++] = a[x++];
        while(a[x] > a[y] && y <= r) d[cnt++] = a[y++];
        ans += y-l;
    }
    for(int i = l;i <= r; i++)
        a[i] = d[i];
}

高速電力(これは振り返る必要があります!)

チェス盤カバー(へロス・バレーは見るために!)

直接、我々は問題を単純化し、徐々に検討し、実現可能ないないようです

3チェック柄姫がOKにカーペット敷き立っていない置く:迷路は、プログラムは非常に簡単です、2つの* 2つの正方形であると仮定

今4つの考える正方形4、我々は4つの2に分割正方形2、王女は2というように、そのうちの一つをスタンドにバインドされたカーペット敷きの方法グリッド2を再帰的にアップして計算することができます。他の3 2の場合は、グリッド2、我々はXianpuそれらの3間のカーペットは、このカーペットは3人の王女を想像し、私たちは、再帰的に解決することができます

そして、8考える平方8は、我々は4 4に分割した正方形4、王女は4というように、そのうちの一つをスタンドにバインドされたカーペット敷きの方法グリッド4は、再帰的に取得することができます。他の3、4-について 4グリッド、我々 Xianpuそれらの3間絨毯、このカーペットは3人の王女を想像し、私たちは、再帰的に解決することができます

K-小さな要素!

あなたはNの配列の長さを与え、前記小型のk番目の要素を決定するために頼みます

1 <= K <= N <= 2000000

直接k個の小さなを見つけることができません並べ替え、この質問だけでO(N)アルゴリズム

同様のクイックソート、我々は最初のランダムな値を見つけ、その後、あなたはXの数を数えることができますので、配列全体にわたって掃引することは彼の数字よりも大きく、彼の番号はYの数より少ない、そしてZは彼の番号と同じです

K <= Yは、その後、我々は後半を支配していない場合は、これらの要素の最初のK少数が彼らでなければなりません、あなたは再帰的にすることができます

Y <K <= Y + Z、及び最初の要素が小さいKである場合

Y + Z <kは、その後、我々は従わなければならないこれらの要素のK番目の少数の前半を制御しない場合、我々は最初のK-(Y + Z)を探している要素のXの数

値がランダムに選択され、以来、私たちは彼がほぼ二等分オリジナルシリーズを置くことができると思います

したがって、T(N)= O(N)+ T(N / 2)、アルゴリズムは、のO(N)であります

平面上の最も近い点

面内のn個の点、最小点にすべてのユークリッド距離の点を決定

分割統治。(左に、最小値、程度の間隔の最新の値の右側の最小値)はd = minの各

最近、どのように行う間隔の値は?

まず、X =分(最小左右分)を得ます

Xに従って、すべての点座標(またはy):(昇順に。

点のセットは2つのセットに分割するようにインデックスは、分割されています。

再帰的に2つのコレクションに最も近い点を見つけます。

最小限に最も近い点の2セットを取ります

最も近い距離必ずしも二組に存在しない場合は、より少ない2つのDISの間の距離よりも、点A、セット中の点Bに設定してもよいです。

牛石蹴り

先生を見にUSACO 2月15日の裏には、自分自身を話しませんでした

おすすめ

転載: www.cnblogs.com/Cao-Yucong/p/12207949.html