羅区P2038ワイヤレスネットワークの送信機サイト

タイトル説明

スマートフォンの普及によって、ワイヤレスネットワークの需要が増加しています。都市ワイヤレスネットワークの範囲内の公共の場所での都市の決定。

厳密に平行都市レイアウトと仮定\(129 \)東西及び街路(129 \)\の南北の通りによって形成された格子を、隣接する平行通りの間の距離は一定であります$ 1 $。北から南へ、東・西通りが番号が付けられ、\(0,1,2 ... 128 \)をして、\(0,1,2 ... 128 \) 南北の通りは、$ 0と西から東に番号が付けられています2 ... $ 128

そして南北東西の通りが交差点を形成するように交差し、番号の規定\(X \)南北通りの及び数\(Y軸\)が $(x、y)は$を形成東西通りの交差点の座標。特定の交差点にある公共の場所の特定の数があります。

政府の財政問題として、唯一の大規模な無線ネットワーク送信機をインストールすることができます。無線ネットワークの送信機に到達すると、中心点、正方形$ $ 2Dの辺の長さです。正方形の境界を含むリーチ。

今、関係政府部門は$ d個の$のための無線ネットワーク送信機の伝搬パラメータをインストールする準備ができて、私はあなたがカバーされ、市内のほとんどの公共の場所を作り、それらを設置場所として右の交差点を見つけるのに役立つ願っています。

入力形式

最初の行は、整数の$ D $を含んでいる、無線ネットワーク送信機の伝搬距離を表します。

第二行は、整数含ま\を(N- \) 公共の場所で交差の数で表さ。

次のnラインは、各ラインは、3つの整数Xの$、Y、K、与えられ\(スペースで区切らを、交点の座標を表す\)(x、y)は$接合や公共の場所の数。同じ座標は、一度与えられます。

出力フォーマット

スペースで区切られた2つの整数を含む出力ライン、および公共の場所の数は、それぞれ、公共の場で覆い隠すことができますプログラムの設置場所の数をカバーすることができます。

サンプル入力と出力

入力#1の複製

1
2
4 4 10
6 6 20

コピー出力#1

1 30

説明/ヒント

对于\(100%\)的数据、\(1 \当量D \当量20、1 \当量のn \の当量20.0 \当量 X \当量128 0 \当量のY \の当量128、0 <K \当量1000000 、1≤d≤20,1≤n≤20,0≤x≤128,0≤y≤128,0<k≤1000000\)

解像度:

一つシンプルシミュレーションの質問。

ですので\(129 \ 129回\)の正方形の、私たちは、各点を列挙することができます

そして、中心点は、4週間の出発点とし、蓄積を掃除することができます

我々は2つの変数を記録しなければなりませんでした、

\(NUM \)最大記録の数\(ANS \)が最大値を記録し、

1つの明白な結論があるということです

私たちは、あなたがNUM 1を交換して置くことができる最大時間を置き換えます

この値は、意志後で同じか、より多くのです。

感情的な理解。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#define re register
#define Max 130
int n,ans = 0,d,g[Max][Max],num;
inline void init() {
    scanf("%d%d",&d,&n);int x,y,k;
    for(re int i = 1 ; i <= n ; ++ i)
        scanf("%d%d%d",&x,&y,&k),g[x][y] = k;
}
void work() {
    int max_place;
    for(re int i = 0 ; i <= 128 ; ++ i)
        for(re int j = 0 ; j <= 128 ; ++ j) {
            max_place = 0;
            for(re int a = -d ; a <= d ; ++ a)
                for(re int b = -d ; b <= d ; ++ b)
                    if(a + i >= 0 && a + i <= 128 && b + j <= 128 && b + j >= 0)//判断边界情况
                        max_place += g[a+i][b+j];
        if(max_place == ans) num++;
        if(max_place > ans) ans = max_place, num = 1;
        }
}
inline void print() {printf("%d %d",num,ans);}
int main() {
    init();
    work();
    print();
    return 0;
}

おすすめ

転載: www.cnblogs.com/handsomegodzilla/p/11442907.html