티스토리 뷰
이 문제는 투 포인터의 개념으로 풀 수 있다!
디스크가 쌓여져있는 모습을 생각하며 전처리를 해줘야한다
각 디스크 자리에 들어갈 수 있는 최대의 수를 미리 구해보자!
그리고 아래서부터 들어가 쌓이므로 거꾸로 최대의수 배열을 보며 디스크를 넣어보면 된다
while문을 통해 내가 현재 넣을 수 있는 가장 아래칸을 찾고
위치를 계속 갱신해 나간다
그리고 마지막으로 우린 뒤집어서 봤으므로 다시 위치를 뒤집는다!
디스크를 넣을 수 있는 N개의 칸을 모두 다 지나쳐 버리면 답은 0이 된다!
소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int arr[300030];
int disc[300030];
int minn[300030];
int main(){
//freopen("input.txt","r",stdin);
int tc; scanf(" %d",&tc); int c=1;
while(tc--){
memset(arr,0,sizeof(arr));
memset(disc,0,sizeof(disc));
memset(minn,0,sizeof(minn));
int n,q; scanf(" %d %d",&n,&q);
for(int i=0;i<n;i++) scanf(" %d",&arr[i]);
for(int i=0;i<q;i++) scanf(" %d",&disc[i]);
int temp=1e9;
for(int i=0;i<n;i++){
temp = min(temp,arr[i]);
minn[i]=temp;
}
reverse(minn,minn+n);
int pos=0;
int ans=0;
bool check= true;
for(int i=0;i<q;i++){
while(pos < n && (minn[pos] < disc[i])) pos++;
if(pos==n) {
check=false; break;
}
ans = ++pos;
}
ans = (check) ? n-ans+1 : 0;
printf("#%d %d\n",c++,ans);
}
}
|
s |
'알고리즘 > SW Expert Academy' 카테고리의 다른 글
[SWEA] 8998 세운이는 내일 할거야 (0) | 2020.01.14 |
---|---|
[SWEA] 1824 혁진이의 프로그램 검증 (0) | 2020.01.12 |
[SWEA] 3752 가능한 시험 점수 (0) | 2020.01.12 |
[SWEA] 1249 보급로 (0) | 2020.01.11 |
[SWEA] 2819 격자판의 숫자 이어 붙이기 (0) | 2020.01.11 |
댓글