[OpenJ_Bailian - 1328]レーダーインストール(貪欲)

レーダーの設置

元は中国に直接、英語であります

説明:

海岸線は無限に長い直線であると仮定します。海岸線の片側に位置土地、反対側の海。各島は海のポイントに配置されています。唯一の距離dを覆うレーダインストール(両方の海岸線上に位置する)ので、海洋の条件のいずれかがレーダインストールの島で覆われているため両者間の距離d以下です。 

我々は、デカルト座標系を使用して、海岸線をX軸と定義されます。海側のx軸側には、陸側が下方に位置しています。海での各島の位置を考えると、与えられた距離レーダーのインストールをカバーするために、あなたのタスクは、すべての島を覆うように設置レーダーの最小数を見つけるためのプログラムを書くことです。注:そのXYに島の場所は、表現を調整します。 

パネルA:入力レーダー設置の例

入力

テスト複数のコンポーネントによって入力されました。各テストケースの最初の行は、2つの整数のn(1 <= N <=含ま 1000) 、nは、海洋の島の数であり、dは、Dは、レーダ設置の距離カバレッジです。n行続いて、各ラインは、各島の座標を表す2つの整数を含んでいます。各テスト、空白行間隔の間。 

出力

テストケースの数、及びレーダーのインストールを含む各テストケースに必要な最小数、出力ライン、。「-1」取り付け、試験には溶液がないことを示します。

サンプル入力

3 2 
1 2 
-3 1 
2 1 

1 2 
0 2 

0 0

サンプル出力

ケース1:2 
ケース2:1

トピックリンク:

https://vjudge.net/problem/OpenJ_Bailian-1328

レーダーは、X軸をする必要があり、[S [i]は.LEFT、S [i]は.RIGHT各島がx軸であるS [i]の.LEFT、及びs [i]は.RIGHT上の対応点を有し、間問題が最小となる点に変換され、全てのセグメントが覆われています

ACコード:

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <fstreamの> 
の#include <アルゴリズム> 
書式#include <cmath> 
の#include <両端キュー> 
の#include <ベクトル> 
の#include <キュー> 
の#include < 文字列 > 
の#include <CStringの> 
書式#include <マップ> 
書式#include <スタック> 
の#include < 設定 > 
書式#include <sstream提供>
#define MOD 1000000007件
 の#define EPS 1E-6
 の#defineっ長い長い
 の#define INF 0x3f3f3f3f
#define ME0(X)のmemset(X、0、はsizeof(x))を
 使用して 名前空間STD;
 構造体のポイント
{ 
    ダブル左、右; // セグメントが終了
    BOOLの 演算子 <(CONSTポイント&C)のconst // ソーティングエンドポイントによっては何
    {
         リターン <左c.left; 
    } 
}; 
ポイントは、ポイント[ 1005 ];
 int型N-、D;
 int型 SUM = 0 ;
 int型のF =を1。;
 //は各ケース見つける
intは(解決)
{ 
    int型 ANS =1 ; // レーダーの数
    ダブルnowpos、
    ソート(ポイント、ポイント + N-);
 //     用(INT I = 0、I <N - 、I ++)
 //     COUT <<ポイント[I] .LEFT << "" < <ポイント[I] .RIGHT << ENDL; 
    nowposポイント= [ 0 ] .RIGHT;
     のためのINT I = 1 ; I <N-; ++ I)
    { 
//         COUT << "*" << ENDL; 
        IF(点[I] .LEFT <= nowpos)
            nowpos = 分(nowpos、ポイント[I] .RIGHT);
         // 現在の行と現在のラインセグメントがない交差点、新しいレーダーを添加しない場合
        {
             ++
            nowpos = 点[i]は.RIGHT。
        } 
    } 
        戻りANS。
} 
int型のmain()
{ 
    一方(CIN >> N >> D、N + D)
    { 
        F = 1 
        合計 ++ ;
        INT X、Y。
        以下のためにint型 i = 0 ; iがn <; ++ I)
        { 
            CIN >> X >> Y。
            もし(Y> D)
                F = 0 他の
            {
                ダブル T = D *のDy *のY。
                点[i]は.LEFT = X- SQRT(T)。
                点[i]は.RIGHT = X + SQRT(T)。
            } 
        } 
        もし、(F)
            のprintf(" ケース%D:%Dを\ n " 、和、解きます())。
        
            のprintf(" ケース%D:-1 \ nを" 、合計)。
    } 
}

 

おすすめ

転載: www.cnblogs.com/sky-stars/p/11073226.html