본문 바로가기

2017/08/20

BOJ)2104 부분배열 고르기 문제: icpc.me/2104 주어지는 배열에서 i~j까지의 부분 배열을 선택했을 때 (a[i]+a[i+1]+...+a[j])*(min(a[i],a[i+1]),....,a[j]) 가 최대가 되도록 i j를 선택하는 문제이다. 나이브한 풀이법으로는 i,j를 선택하는데만 O(N^2)으로 시간초과다 .. 따라서 좀 더 그리디하게 생각해보면 만약에 어떤 구간에 대해 정할 때 한 점 X를 기준으로 그 점이 최솟값이 되게 구간을 선택한다면 X를 기준으로 좌우로 최대한 X보다 큰값을 가지는 범위롤 포함하도록 배열을 선택할 수 있다. 이러한 아이디어에서 출발하여 모든 점에 대해서 이 범위를 볼건데 정렬을 해주어 작은 값부터 보면서 set에 업데이트해주어 이동가능한 lower_bound와 upper_bound를 찾아준다.. 더보기
뒤늦은 제 3회 SCPC 후기 목요일에 SCPC가 끝났다. 사실 그렇게 큰 기대를 하고 가지는 않았지만 혹시 모를 행운을 위해 플로우쪽을 준비를 해갔지만 아쉽게도 플로우 문제는 나오지 않았다 ㅠㅠ 본선에는 총 4문제가 나왔는데 1번 문제는 정말 쉬운 문제가 나왔다. 그래서 거의 시작하자마자 곳곳에서 타자소리로 어수선해졌다. 1번 문제를 빠르게 해결하고 2번 문제를 보자마자 좌절했다.. 기하라니 .. 점과 직선사이의 거리를 n^2으로 탐색하는 솔루션은 알 수 있었지만 그 이상으로 발전시키기도 힘들었고 기하는 라이브러리로만 만들어 놨지... 벡터에 관련 된 공식들이 가물가물해서 C번을 먼저 보기로 했다. C번을 보고 미디움 솔루션이 바로 떠올라서 코딩을 했다 (long long을 사용안한 초보적인 실수때매 2번이나 틀린건 비밀..) 이제.. 더보기
BOJ)2872 우리집엔 도서관이 있어 문제: icpc.me/2872 책의 순서가 주어졌을 때 책을 정렬하는데 필요한 최소 이동횟수를 출력하는 문제이다. 책을 이동하는 조건은 무조건 하나의 책을 들어서 맨위에 쌓는 방법밖에 없기 때문에 가장 뒤에 있어야 하는 책은 옮길 필요가 없다. 가장 큰 숫자부터 연속 된 숫자가 얼마나 긴 부분 증가 수열을 이루고 있는지 확인하면 된다. 1234567891011121314#include #include using namespace std;int n, a[300030], here;int main() { scanf("%d", &n); for (int i = 0; i = 0; i--) if (a[i] == here)here--; printf("%d\n", here); return 0;}Colored by Col.. 더보기