#include <iostream>
using namespace std;
int n, q;
int arr[500001] = { 0, };
int qarr[500001] = { 0, };
int binarysearch(int v, int s, int e) { // recursion
//1.base condition
if (s > e)
return -1;
//2.divide
int m = (s + e) / 2;
if (v == arr[m]) return m;
elseif (v > arr[m]) return binarysearch(v, m + 1, e);
elsereturn binarysearch(v, s, m - 1);
}
int binarysearch2(int v, int s, int e) { // while
int start_val = s;
int end_val = e;
while (start_val <= end_val) {
int m = (start_val + end_val) / 2;
if (v == arr[m]) return m;
elseif (v > arr[m]) start_val = m + 1;
else end_val = m - 1;
}
return -1;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++)
cin >> arr[i];
cin >> q;
for (int i = 0; i < q; i++)
cin >> qarr[i];
for (int i = 0; i < q; i++) {
int val = binarysearch(qarr[i],0,n-1);
cout << val;
if (i != (q - 1))
cout << ' ';
}
cout << endl;
return 0;
}
#include <stdio.h>#define MAXSIZE 100000
const int LM = (int)100001;
int index[LM], temp[LM];
void mergesort(int s, int e, int* a, int* b) {
//1. base condition
if (s >= e)
return;
//2.divide
int mid = (s + e) / 2;
//3. conquer
mergesort(s, mid, a, b);
mergesort(mid + 1, e, a, b);
//4. merge
int i = s, j = mid + 1;
for (int k = s; k <= e; k++) {
if (i > mid)
b[k] = a[j++];
elseif (j > e)
b[k] = a[i++];
elseif (a[i] > a[j])
b[k] = a[j++];
else
b[k] = a[i++];
}
//5. copy
for (int k = s; k <= e; k++) {
a[k] = b[k];
}
}
이때, 총합의 합이 같기 때문에 1000x1000만으로도 a,b,c의 값을 저장할 수 있다는 것을 파악해야 한다.
큐에 들어가는 값은 정렬을 하여서 사용한다.
그 이유는 중복을 방지하기 위함과 런타임에러(OutOfBounds)를 방지하기 위함
문제풀이
1. 큐를 사용한 bfs 구현
2. y_ar과 x_ar를 통해서 현재 값을 기준으로 탐색해야 하는 값들을 도출
정답코드
#include<iostream>#include<algorithm>#include<queue>usingnamespace std;
int visited[1001][1001] = { 0, };
int a, b, c, d = 0;
intbfs(){
queue <pair<int, int>> que;
que.push(make_pair(a, b));
visited[a][b] = 1;
while (!que.empty()) {
int ca = que.front().first;
int cb = que.front().second;
int cc = d - ca - cb;
que.pop();
if (ca == cb && ca == cc)
return1;
int n_x[3] = { ca,ca,cb };
int n_y[3] = { cb,cc,cc };
for (int i = 0; i < 3; i++) {
int na = n_x[i];
int nb = n_y[i];
if (na < nb)
nb -= na, na += na;
elseif (na > nb)
na -= nb, nb += nb;
elsecontinue;
int nc = d - na - nb;
int ra = min(min(na, nb), nc);
int rb = max(max(na, nb), nc);
if (visited[ra][rb] == 0) {
visited[ra][rb] = 1;
que.push(make_pair(ra, rb));
}
}
}
return0;
}
intmain(){
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> a >> b >> c;
d = a + b + c;
if ((a + b + c) % 3 != 0)
cout << 0 << endl;
else
cout << bfs() << endl;
return0;
}
#include<iostream>usingnamespace std;
int n, m;
char arr[3001][3001];
longlong dp[3001][3001];
longlong result = 0;
longlongsolved(int y, int x){
if (y == n && x == m)
return1;
longlong& ret = dp[y][x];
if (ret != -1)
return ret;
ret = 0;
if (arr[y][x] == 'B') {
if ((y + 1) <= n)
ret += solved(y + 1, x);
if ((x + 1) <= m)
ret += solved(y, x + 1);
}
elseif (arr[y][x] == 'E') {
if ((x + 1) <= m)
ret += solved(y, x + 1);
}
else {
if ((y + 1) <= n)
ret += solved(y + 1, x);
}
ret %= 1000000009;
return ret;
}
intmain(){
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
cin >> arr[i][j];
dp[i][j] = -1;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
result += solved(i, j);
cout << result % 1000000009 << endl;
return0;
}
#include<iostream>#include<queue>usingnamespace std;
int n = 0;
priority_queue <int> que;
longlong result = 0;
intmain(){
cin >> n;
int temp;
for (int i = 0; i < n; i++) {
cin >> temp;
que.push(temp * -1);
}
while (que.size() != 1) {
int a = que.top() * -1;
que.pop();
int b = que.top() * -1;
que.pop();
result += (a + b);
que.push( (a + b) * -1);
}
cout << result << endl;
return0;
}