白駿1920首を探す
3134 ワード
今回解決すべき問題は難易度4の問題です.
この探索について知っていれば、簡単に解決できる問題だと思います.
質問リンク:https://www.acmicpc.net/problem/1920
解法:時間は2秒に制限されます.完全なナビゲーションで解くことができます
このように解けば,nとmが収容できる最大数は100000である.
時間の複雑さはO(n^2)であり,タイムアウトを招く.もしそうなら、私たちは別の方法を考えなければなりません.
この時、私が考えた方法はこの人を探求することです.
この2回のナビゲーションの時間的複雑さはO(log 2 n^2)(底部は2 inlogn二乗)である.
もしあなたが答えを理解していないか、もっと良い答えがあるなら、伝言を残してください.🙋♀️
この探索について知っていれば、簡単に解決できる問題だと思います.
質問リンク:https://www.acmicpc.net/problem/1920
解法:時間は2秒に制限されます.完全なナビゲーションで解くことができます
このように解けば,nとmが収容できる最大数は100000である.
時間の複雑さはO(n^2)であり,タイムアウトを招く.もしそうなら、私たちは別の方法を考えなければなりません.
この時、私が考えた方法はこの人を探求することです.
この2回のナビゲーションの時間的複雑さはO(log 2 n^2)(底部は2 inlogn二乗)である.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
cin.tie(0);
cout.tie(0);
std::ios::sync_with_stdio(false);
int n,m;
cin>>n;
vector<int>v_n(n);
for(int i=0;i<n;i++){
cin>>v_n[i];
}
//오름차 정렬
sort(v_n.begin(), v_n.end());
cin>>m;
vector<int>v_m(m);
for(int i=0;i<m;i++){
cin>>v_m[i];
}
//찾아야 할 수의 기준으로 for문을 돌린다
for(int i=0;i<v_m.size();i++)
{
bool flag=false;
int lt=0;
//n과 m의 수는 다를수 있음
//rt를 v_n의 크기로 잡아야 한다
//rt를 v_m의 크기로 잡을경우, 틀림
int rt=(int)v_n.size()-1;
int mid=0;
//while문 종료 조건
while(lt<=rt){
mid=(rt+lt)/2;
//mid에 해당하는 v_n의 벡터값이 찾고가 하는 수 보다 작으면
//mid까지는 모두 찾고자 하는 수보다 작은 값들이 들어있다.
if(v_m[i]>v_n[mid]){
lt=mid+1;
}
//위의 경우와 반대
else if(v_m[i]<v_n[mid]){
rt=mid-1;
}
//같을경우 탈출해도 됨
else if(v_m[i]==v_n[mid]){
flag=true;
break;
}
}
if(flag==false){
cout<<0<<"\n";
}
else{
cout<<1<<"\n";
}
}
return 0;
}
初めて問題を解いたとき、nとmの入力数が違うかもしれないと何度も間違えた.もしあなたが答えを理解していないか、もっと良い答えがあるなら、伝言を残してください.🙋♀️
Reference
この問題について(白駿1920首を探す), 我々は、より多くの情報をここで見つけました https://velog.io/@hyojeong555/백준-1920-수-찾기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol