일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 그리디
- 이분탐색
- 펜윅트리
- 위상정렬
- 브루트포스
- LazyPropagation
- 다익스트라
- 세그먼트트리
- 크루스칼
- 이분매칭
- 삼분탐색
- 좌표압축
- dfs
- 구현
- 투포인터
- DisjointSet
- 에라토스테네스의 체
- lis
- 비트마스크
- DP
- 플로이드와샬
- 백준
- boj
- BFS
- 정렬
- lca
- 수학
- MST
- 이진탐색
- 누적합
Archives
- Today
- Total
lastknight00
[백준] 로봇 프로젝트(3649) 본문
문제 링크 : [백준] 로봇 프로젝트(3649)
문제 설명
주어진 N개의 수 중, 더해서 X를 만들 수 있는 두 수를 고르시오.(여러개라면 두 수의 차이가 큰 것을 출력)
입력
x(구하고자 하는 길이(cm), 1<=x<=20)
n(주어지는 레고의 갯수, 0<=n<=100,000)
Di(i번째 레고의 길이(nm), 1<=Di<=100,000,000)
@주의
- 테스트 케이스가 여러개임.
- x의 단위는 cm, 레고의 길이 단위는 nm.
1
4
9999998
1
2
9999999
출력
yes 1 9999999
카테고리
#투포인터
시간 복잡도 상한
n이 최대 10만이기 때문에 최대 O(nlogn) 이하로 끝내야합니다.
해결 방법
- 주어진 레고의 순서는 중요하지 않습니다.(index를 활용하는 곳이 없음)
- 데이터를 오름차순 정렬한다면,
2-1. Di + Dj(i<j)가 x보다 작다면, Di + Dk (i<k<j)는 항상 x보다 작습니다..
2-2. Di + Dj(i<j)가 x보다 크다면, Dk + Dj (i<k<j)는 항상 x보다 큽니다.. - 2의 특성을 이용하여, i=1, j=n 인덱스부터 시작하고, Di + Dj(i<j)가
3-1. x보다 크다면, j를 -1합니다.
3-2. x보다 작다면, i를 +1합니다.
3-3. x와 같다면, 그 수를 출력합니다.(이후에 x를 만족하는 값이 있더라도, 두 수의 차이가 최초 나온 수들의 차이보다 항상 작거나 같기 때문에, 더이상 진행할 필요가 없습니다.)
코드
#include<cstdio>
#include<algorithm>
int x,n,d[1000000],i,a;
int main(){
while(scanf("%d",&x)==1){
scanf("%d",&n);
for(i=0;i<n;i++)scanf("%d",d+i);
std::sort(d,d+n);
i=0,n--,x*=10000000,a=-1;
while(i<n){
a=d[i]+d[n];
if(a==x)break;
else if(a<x)i++;
else n--;
}
if(a==x)printf("yes %d %d\n",d[i],d[n]);
else printf("danger\n");
}
}
'PS' 카테고리의 다른 글
[백준] 인경호의 징검다리(11583) (0) | 2020.05.26 |
---|---|
[백준] 커플 만들기(1727) (0) | 2020.05.26 |
[백준] 개똥벌레(3020) (0) | 2020.05.26 |
[백준] 택배(1719) (0) | 2020.05.26 |
[백준] 가스관(2931) (0) | 2020.05.26 |
Comments