白俊解答-部分合わせて1806回
📜 理解问题
10000以下の自然数からなる長さNの数列.この数列の連続数の部分と中の和がSより大きく、最短の長さを求めるプログラムを作成してください.
💡 問題の再定義
数列の和がSの最短長より大きいことを求めます.
▼▼▼計画作成
2つの挿入法を用いてO(N)内で問題を解決できた.
startとendを0番目のインデックスから開始し、startとendの間の値の和がSより大きい場合は、それらが最も短い長さであることを確認します.次にstartをs以下に増やし、部分和を求める.startがendになり、最短の長さを出力するまで実行します.
💻 計画の実行
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int N, S, sum = 0, start = 0, end = 0, min_length = 100001;
cin >> N >> S;
vector<int> num(N+1);
for (int i=0; i<N; i++) {
cin >> num[i];
}
while (true) {
if (sum >= S) {
if (end - start < min_length) min_length = end - start;
sum -= num[start];
start += 1;
}
else {
sum += num[end];
if (end < N) end += 1;
else {
sum -= num[start];
start += 1;
}
}
if (start >= end) break;
}
min_length = min_length == 100001 ? 0 : min_length;
cout << min_length;
return 0;
}
🤔 振り返る
この問題は最初はBrootforceで解決したが,アルゴリズムはO(N)であった.²)そのためタイムアウトが発生しました.2つのポインタアルゴリズムで問題を解決してこそO(N)内で問題を解決できるのでBrootforceは使用できない.次のリンクは、2つのポインタアルゴリズムの説明です.
https://github.com/WooVictory/Ready-For-Tech-Interview/blob/master/Algorithm/%ED%88%AC%ED%8F%AC%EC%9D%B8%ED%84%B0%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.md
Reference
この問題について(白俊解答-部分合わせて1806回), 我々は、より多くの情報をここで見つけました https://velog.io/@delicate1290/백준-문제-풀이-부분합-1806번テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol