[規格/c+]2110号:ルータのインストール
8414 ワード
質問リンク
最初の家にはルータを設置しなければなりません.
2 3
5
15
18
テストケースがあります
最初の間隔は9です.
5号室にルーターを1台取り付けます.
15日に家に帰ってもう一台入れます.
そして15号室に設置されているルーターと前/後に設置されているルーターの間隔は少なくとも9でなければなりませんが、そうではありませんので、間隔を短くする必要があります.
最終的にルータをインストールせず、すべての家にアクセスしたのでrightをmid-1に調整しました.(間隔を縮める)
間隔は4です.(left = 0, right = 8)
5号室にはもう1台設置されていて、
15日に家に帰って1台詰めます.
15号と18号の間隔が3なので、18号にルーターを取り付けることはできません.
だから間隔を短くします.
間隔は3(左=0、右=3)
現在は間隔が3なので、5日、15日、18日の自宅に3台のルーターを設置することができます.
まず正解を3に設定し、間隔を増やします.(最大間隔を探す問題なので)
現在のテストケースの範囲は狭いため、これで終わります.
5 3
1
2
8
4
9
アイデア
説明:
最初の家にはルータを設置しなければなりません.
2 3
5
15
18
テストケースがあります
#1
最初の間隔は9です.
5号室にルーターを1台取り付けます.
15日に家に帰ってもう一台入れます.
そして15号室に設置されているルーターと前/後に設置されているルーターの間隔は少なくとも9でなければなりませんが、そうではありませんので、間隔を短くする必要があります.
最終的にルータをインストールせず、すべての家にアクセスしたのでrightをmid-1に調整しました.(間隔を縮める)
#2
間隔は4です.(left = 0, right = 8)
5号室にはもう1台設置されていて、
15日に家に帰って1台詰めます.
15号と18号の間隔が3なので、18号にルーターを取り付けることはできません.
だから間隔を短くします.
#3
間隔は3(左=0、右=3)
現在は間隔が3なので、5日、15日、18日の自宅に3台のルーターを設置することができます.
まず正解を3に設定し、間隔を増やします.(最大間隔を探す問題なので)
現在のテストケースの範囲は狭いため、これで終わります.
問題のテストケース
5 3
1
2
8
4
9
コミットコード
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);
int n, c;
cin >> n >> c;
int input;
vector<int> v;
for (int i = 0; i < n; i++)
{
cin >> input;
v.push_back(input);
}
sort(v.begin(), v.end());
int left = 0;
int right = v.back();
int ans = -1;
while (left <= right)
{
int mid = (left + right) / 2;
int beforeSetIdx = 0; // 공유기를 놓은 첫번째 집
int cnt = 1; // 첫번째 집에 설치된 공유기
for (int idx = 1; idx < n; idx++)
{
if (v.at(idx) - v.at(beforeSetIdx) >= mid)
{
beforeSetIdx = idx;
cnt++;
}
}
if (cnt >= c)
{ // 간격 늘리기
ans = mid;
left = mid + 1;
}
else // 간격 좁히기
right = mid - 1;
}
cout << ans;
return 0;
}
Reference
この問題について([規格/c+]2110号:ルータのインストール), 我々は、より多くの情報をここで見つけました https://velog.io/@fere1032/백준c-2110번-공유기-설치テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol