티스토리 뷰

728x90

문제 링크

https://www.acmicpc.net/problem/3649

 

3649번: 로봇 프로젝트

문제 상근이와 선영이는 학교 숙제로 로봇을 만들고 있다. 로봇을 만들던 중에 구멍을 막을 두 레고 조각이 필요하다는 것을 깨달았다. 구멍의 너비는 x 센티미터이고, 구멍에 넣을 두 조각의 길이의 합은 구멍의 너비와 정확하게 일치해야 한다. 정확하게 일치하지 않으면, 프로젝트 시연을 할 때 로봇은 부수어질 것이고 상근이와 선영이는 F를 받게 된다. 구멍은 항상 두 조각으로 막아야 한다. 지난밤, 상근이와 선영이는 물리 실험실에 들어가서 레고 조각의 크기를

www.acmicpc.net

 

두 블록 길이의 합이 정확히 구멍의 길이와 같은 블록을 찾는 문제입니다.

 

풀이

1) 구멍의 너비 x의 단위는 센티미터이므로, x에 10,000,000을 곱한다.

2) 레고 조각의 길이를 오름차순으로 정렬한다.

3) 앞에서부터 반복문을 돌리면서 lower_bound()로 적당한 값이 있는지 확인한다. 현재 보고 있는 길이를 p[i]라 하면 (*lower_bound(현재+1, 끝, x-p[i]) == x-p[i]) 인 경우가 답이다.

 

정답이 여러 개인 경우 $|l_1 - l_2|$가 가장 큰 것을 출력해야 합니다. 따라서 앞에서부터 보면서 정답을 찾자마자 출력하고 반복문을 탈출하면 됩니다.

 

 

정답 코드

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
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
 
ll x, p[1'001'000];
int n;
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    while(cin>>x){
        memset(p, 0sizeof(p));
        x *= 10'000'000;
        cin>>n;
        for(int i=0; i<n; i++){
            cin>>p[i];
        }
        sort(p, p+n);
        for(int i=0; i<n-1 ;i++){
            ll c = *lower_bound(p+i+1, p+n, x-p[i]);
            if(c == x-p[i]){
                cout<<"yes " << p[i]<<' '<<c<<'\n';
                goto pass;
            }
        }    
        cout<<"danger\n";
pass:;
    }
}
 
cs
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함