[C++]白駿1654:網線を切る


#include <iostream>
#include <vector>
using namespace std;

int K, N;
vector<int> line;

int main(int argc, char **argv){
    int x, maxN = 0;

    scanf("%d %d",&K,&N);

    for(int i=0; i<K; i++){
        scanf("%d", &x);
        line.push_back(x);
        maxN = max(maxN, x); // 최대값 저장
    }

    long long left = 1, mid, right = maxN;
    long long result = 0, tmp; // 초기화해주기
    while(left <= right){
        mid = (left + right) / 2;
        tmp = 0;
        for(int i=0; i<line.size(); i++){
            tmp += line[i] / mid;
        }

        if(tmp >= N){
            left = mid + 1;
            result = max(result, mid); // 값 갱신 - 랜선의 최대길이
        } else {
            right = mid - 1;
        }
    }

    printf("%lld", result);

    return 0;
}
本来はバイナリ検索で解くのではなく,中間値−1で解く.もちろん一時停止です...だからバイナリ探索で解決することにした.
あと2つ気をつけなければならないことがあります.
  • N個より多く作られていますが、N個も含まれています.
    だから、N個以上の場合は、どれも救える.
  • N本のローカルエリアネットワーク線を作成できる最大長さ
    :そのため、ローカルエリアネットワークの最大長を更新し、求めた値に基づいてバイナリ検索を続行します.
  • そしてresult=0初期化!私にくれなかったので、値段は普通に出力していましたが、白準に回ってしまい、結果が間違っていました.