Codeforces Cのマッチポイント(半分貪欲)

件名の説明:

マッチポイント

テストあたりの時間制限

2秒

テストごとのメモリ制限

256メガバイト

入力

標準入力

出力

標準出力

あなたは点の集合を与えられているのx 1、...、* X ** N *

二点Iと、以下の条件が保持している場合とを一致さjcan:

  • どちらももjが、他の点で一致しています。
  • | X I - X J |≥のZ

あなたがお互いに一致させることができるポイントのペアの最大数は何ですか?

入力

最初の行は、2つの整数を含むn個

及び(2≤ N ≤2⋅105) -点の数とそれぞれ一致点間の距離の制約、。

2行目は含まれてn個の整数、X 2(1≤* X ** iは*を≤109

出力

あなたがお互いに一致させることができるポイントのペアの最大数 - 1つの整数を印刷します。

入力

コピー

4 2
1 3 3 7

出力

コピー

2

入力

コピー

5 5
10 9 5 8 7

出力

コピー

1

注意

最初の例では、ポイント1と一致すること

(| 3-1 |≥2点4との)時点で。

第二の例では、ポイント1と一致すること

(≥5| | 5-10)の点で

アイデア:

ただ、最大のマッチああ〜ハンガリーのアルゴリズム、それを実行しようとすると、マップを構築するのを見、うまく試合を開始する2部グラフマッチングを考えたかったです。明らかにデータが少し大きい範囲しかし、それは(必然的に)タイムアウトした可能性があります。かかわらず、これはそれについて書くことを期待しています。それを構築する方法を図?でもエッジの条件を満たし、というように、ああ繰り返しているようだ2点間に入れて、私は数がああ再利用することはできません一致します。数の彼の次のツーエンドからの列挙のために:私は練習の問題を解決できると思っていました。ないことができますか?

いいえ。私は本当にただの計画を構築する方法を、カバーするために何か上記の二部グラフを学びたいと思っが明らかに学んでいないが、これは正しいマップを構築することは可能ではありません。頂点が知られていない使用された後、二部グラフを構築することができませんでした、それが使用されている知っているので。

テンプレートナイーブ、私は何回か間違っていたと考えられており、それに別の最大流量、素敵WAてきました。

私は直感を持っていた、その後、半分思った私は、その後、シーケンス列の配列を置く最小の要素の状態を見て、各番号にLOWER_BOUNDことを教えてくれました。しかし、また直感疑問、なぜ貪欲正しいですか?そこには可能性はLOWER_BOUNDが戻ってペアリングペアリング要素に影響を与えた後、ここにはありませんが、また、チェーンに影響を与え、ペアの欲より少ない数のため、より多くのマッチング結果を生み出すことができました。疑惑は、そのような例の組として、正しいです。

4 2

1 3 4 5

あなたはこの方法しか実際には、1,3のペアを装備することができます場合は、2組:1、4、3、5

その後、私は思った、そして、私は彼らが少なくとも交尾する可能性があるので、彼らは総数の大規模な数を満たすために優先順位を作るかもしれませんが、スタートペアリングの可能なペアの最小数から、統計の要素の可能なペアの数を見て、彼は構造のどのような種類を取りました、それは正しくありません。

遠く右のアイデアで私を見て、より多くの正解だと思います。当社は、取得するために正しい解が貪欲であることを知って、それに複雑の半分を知っているが、私は奇妙なことのように思っていますか?

今すぐ右のアイデアを見て、我々は状況が何であるかの最善をしたいですか?各要素は対が装備され、N / 2の合計は右、それはありませんか?さて、今回はそれが何であるかのペアリング?前半の後、小さな機能の半分の大きさではないでしょうか?右半分からこの考えは、遠くではない場合。要素はペアリング、回答統計、および更新開始時刻のペアリングを現れたら、この二分法は、最後のペア王Qianmian半ば1から始まり、特にソートされた配列、ペアリング要素の半分は前半、中盤セット半ばであります現在の位置の前に位置するための出発点。アレイは既に、これは小さな要素の対の後半に参加する次の要素であるよりも、順番に並んで、かつされているので(なぜ?現在の良い仕事は、右、この位置の将来位置に要素が明らかでない場合のでこれは、差分の条件)がZより大きい満たすことができます。

コード:

#include <iostream>
#include <algorithm>
#define max_n 200005
using namespace std;
int n;
int z;
int a[max_n];
int ans = 0;
int main()
{
    cin >> n >> z;
    for(int i = 0;i<n;i++)
    {
        cin >> a[i];
    }
    sort(a,a+n);
    int mid=n/2;
    int l = mid-1;
    for(int i = n-1;i>=mid;i--)
    {
        while(l>=0)
        {
            if(abs(a[l]-a[i])>=z)
            {
                ans++;
                l--;
                break;
            }
            l--;

        }
    }
    cout << ans << endl;
    return 0;
}

追伸:

学習コースのテンプレートは、一定の役割を持っていますが、学習プロセスに依存生産あれば、どのようなテンプレートを適用すると結果が何であるかを考えることではありませんか?どのような質問が問題にBaiduの溶液に、どのような結果が真剣にそれを考えていないしたいですか?ORZ

私は、食品、食品ああを持っているが、

おすすめ

転載: www.cnblogs.com/zhanhonhao/p/11332901.html