CodeForces - 567Dた一次元バトル船

アリスとボブは、1次元の戦闘船をプレイ大好きです。彼らは、以下からなる線状のフィールドで再生n個の正方形のセル(すなわち上で、ある1×  N個のテーブル)。

ゲームの開始時にアリスは入れk個のボブに自分の位置を告げず、フィールド上の船を。各船のように見える1×  (即ち、それは一連の占める矩形フィールドの連続した四角)。船が交差しても、お互いに触れることができません。

その後ボブは「ショット」の順になります。彼の名前フィールドの細胞とアリスのいずれか(「ヒット」)のセルは(「ミス」)空である、または、細胞は、いくつかの船に属していると述べています。

しかし、ここで問題です!アリスはカンニングしたいです。彼女は「ミス」とそれぞれボブの動きに反応する理由があるかもしれません。

それの後にあなたがアリスがだまされていることを確認することができますように、ボブの最初の動きを見つける - ボブがアリスの不正行為をキャッチ助けます。


入力

:入力の最初の行は三つの整数含まNK及び1≤  N、  K、   ≤2・10 5 -フィールドの大きさ、船の数と各船のサイズ)。ことが保証されているNKおよびaはあなたが置くことができるようになっているk個の大きさの船Aを何ら2隻の船が交差していないか、互いに接触するように、フィールド上。

2行目は整数含まM1≤  Mの  ≤の  Nボブの移動の数を- )。

三行目は含まm個の別個の整数であり、X 1、  X 2、...、  XはMX iはボブがなさセルの数であり、I番目のショット。細胞をから左から右に番号が付けられている1 、N

出力

そのようなボブの最初の移動の数、あなたはアリスが嘘をついたことを確認することができた後に-単一の整数を出力します。ボブの動きはから番号が付けられている1 メートルインクルードが行われたために。求める動きが存在しない場合は、印刷する「-1」。

入力
3 3 11 
5
4 8 6 1 11
出力
3
入力
5 1 3 
2
1 5
出力
-1
入力
5 1 3 
1
3
出力
1

ID-OJ:
codeforces-567Dの

著者:
Caution_Xの

提出日:
20191031個の

タグ:
アナログ

説明モデリング:
指定されたマップ1×N、ボート、地図上のKを有し、各ボート空間1×、今入力の数m各番号は、チェック。XIのXI位置はボートを持っている必要があるかどうかを示します。出力:i番目のチェックが船をチェックアウトできるようになる場合、出力I

主要なステップは、それを解決するために:
(1)第1の放電:区間[1、N]与えられ、血管のXの数を置くまで、この間隔を設け次に、X * A +(X-1)= N
=> X =(Nの+ 1)/(+ 1)
(2)最初の場所ではない:設けx番目の位置を確認し、その後、我々はに容器部を置くことができIN [(1、X-1)とx + 1、N]、
その後、x番目のチェックサム=和の実装次に、iを解放することができるステップにおける血管の数を確認するために合計で言及- (RL)/ (A + 1)+(XL)/( A + 1)+(RX)/(A + 1)、 合計が<K、次いで、i番目のステップは、船舶検査を発見する場合は、出力I

ACコード:

#include <iostreamの> 
する#include <CStringの> 
する#include <cstdioを> 
する#include <アルゴリズム> 
の#include < 設定 >
 使用して 名前空間STD。

設定 < 整数 > 秒; 

INT のmain()
{ 
    int型M、N、K、X。
    一方、(scanf関数(" %D%D%D "!、&N&K、&A)= EOF){ 
        scanf関数(" %のD "、&M)。
        s.clear(); 
        s.insert(0)、s.insert(N + 1)。   仮想長さのヒント
        int型 SUM =(N + 1)/(A + 1 ); 
         INT ANS = - 1、F = 0 ;
         のためのINT I = 1 ; I <= M、Iが++ ){ 
            scanfの(" %のD "、&X);
             SET < INT ITイテレータ> :: = (X)をs.upper_bound;
             INT R&LT * = IT、
             int型の L * =( - IT)を、
            SUM = SUMは、 - (R 1はである)/(A + 1)+ (XL)/(A + 1)+(RX)/(A + 1 )。

            もし(合計<K &&!F){ 
                ANS = I。
                F = 1 
            } 
            s.insert(X)。
        } 
        のprintf(" %d個の\ n " 、ANS)。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/cautx/p/11774368.html