한시간 동안 풀었는데 결국 풀지 못했다. 

[2 3 1]

의 뜻이 뭔지 이해가 안 되었던게 컸던 것 같다. 

처음에 생각했던 것은 tetris 니까 n개의 블록을 잘 내려서 줄을 없애라는 줄 알았다. 

이렇게 하면 1개가 있는 자리에 n개의 블록을 1개씩 보내주면 모두 2개 이상이 되어 두 줄을 없앨 수 있어서 

2가 답인 줄 알았다. 

해석할 때 시간이 오래 걸릴 것 같아 파파고번역기로 번역을 해서 한게 좋지 않은 영향을 준 것 같다. 

실제 문제는 Hack 단계에서 다른 사람의 코드를 보니 3개의 열이 있고 주어진 블록을 해당열에다가 쌓는 형식이었다.

문제만 제대로 이해했으면 금방 풀었을 텐데 아쉽다. 

Accept 받은 코드
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <limits.h>
#include <queue>
#include <stack>
using namespace std;
int tb1[100001];
int che[100001];
bool doo[100001];
int n, m;
int main(void)
{
       cin >> n >> m;
       
       for (int i = 0; i < m; ++i) {
              int k;
              cin >> k;
              tb1[k]++;
       }
       int ans = INT32_MAX;
       for (int i = 1; i <= n; ++i) {
              ans = min(ans, tb1[i]);
       }
       cout << ans << endl;
       return 0;
}



B. Lecture Sleep


주인공은 잠이 많아 수업시간에 조는데 깨어있는 동안은 열심히 적는다. 

단 한번 깨울 수 있는데 깨우면 m분만큼 필기를 한다.

 최대한 많이 필기 하는 양을 출력

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <limits.h>
#include <queue>
#include <stack>
using namespace std;
int tb1[100001];
bool che[100001];
bool doo[100001];
stack<int> st;
int n, m;
int main(void)
{
       cin >> n >> m;
       
       for (int i = 0; i < n; ++i) {
              cin >> tb1[i];
       }
       int ans = 0;
       for (int i = 0; i < n; ++i) {
              int k;
              cin >> k;
              che[i] = k;
              if (k == 1) {
                     st.push(i);
                     ans += tb1[i];
              }
       }
       
       int tempansmax = 0;
       for (int i = 0; i < n-m+1; ++i) {
              int tempans = ans;
              for (int k = i; k < i + m; ++k) {
                     if (che[k] == 0) {
                           tempans += tb1[k];
                     }
              }
              tempansmax = max(tempansmax, tempans);
       }
       cout << tempansmax << endl;
       return 0;
}

Time Out 날 걸 확신하고 쓴 코드. 
 for (int k = i; k < i + m; ++k) {
                     if (che[k] == 0) {
                           tempans += tb1[k];
                     }
              }
이 코드를 조금 만 더 최적화 하면 될 것 같다. 

바뀌는 부분은 맨 처음과 맨 끝이므로 
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <limits.h>
#include <queue>
#include <stack>
using namespace std;
int tb1[100001];
bool che[100001];
bool doo[100001];
stack<int> st;
int n, m;
int main(void)
{
       cin >> n >> m;
       
       for (int i = 0; i < n; ++i) {
              cin >> tb1[i];
       }
       int ans = 0;
       for (int i = 0; i < n; ++i) {
              int k;
              cin >> k;
              che[i] = k;
              if (k == 1) {
                     st.push(i);
                     ans += tb1[i];
              }
       }
       int tempans = ans;
       int tempansmax = 0;
       for (int k = 0; k < m; ++k) {
              if (che[k] == 0) {
                     tempans += tb1[k];
              }
       }
       for (int i = 1; i < n-m+1; ++i) {
              if (che[i - 1] == 0) {
                     tempans -= tb1[i - 1];
              }
              if (che[i + m - 1] == 0) {
                     tempans += tb1[i + m - 1];
              }
              tempansmax = max(tempansmax, tempans);
       }
       cout << tempansmax << endl;
       return 0;
}
이렇게 수정을 했는데 TC4에서 Wrong answer 이 나왔다. 

int tempans = ans;
       int tempansmax = 0;
       for (int k = 0; k < m; ++k) {
              if (che[k] == 0) {
                     tempans += tb1[k];
              }
       }
       for (int i = 1; i < n-m+1; ++i) {
              if (che[i - 1] == 0) {
                     tempans -= tb1[i - 1];
              }
              if (che[i + m - 1] == 0) {
                     tempans += tb1[i + m - 1];
              }
              tempansmax = max(tempansmax, tempans);
       }

여기서 tempansmax가 for(int i=1 로 들어가기 전에 k=0~m 까지 더한 값을 저장하고 가야 하는데 놔두고 가서 TC4가
k=0에서 시작해서 하는게 최대값인 경우라 Wrong Answer 이었다 보다


Accept 받은 코드
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <limits.h>
#include <queue>
#include <stack>
using namespace std;
int tb1[100001];
int che[100001];
bool doo[100001];
int n, m;
int main(void)
{
       cin >> n >> m;
       
       for (int i = 0; i < n; ++i) {
              cin >> tb1[i];
       }
       int ans = 0;
       for (int i = 0; i < n; ++i) {
              int k;
              cin >> k;
              che[i] = k;
              if (k == 1) {
                     ans += tb1[i];
              }
       }
       int tempans = ans;
       
       for (int k = 0; k < m; ++k) {
              if (che[k] == 0) {
                     tempans += tb1[k];
              }
       }
       int tempansmax = tempans;
       for (int i = 1; i < n-m+1; ++i) {
              if (che[i - 1] == 0) {
                     tempans -= tb1[i - 1];
              }
              if (che[i + m-1] == 0) {
                     tempans += tb1[i + m-1];
              }
              tempansmax = max(tempansmax, tempans);
       }
       cout << tempansmax << endl;
       return 0;
}



#include <iostream>
using namespace std;
int a[100][100];
bool same(int x, int y, int n) {
       for (int i = x; i < x + n; ++i) {
               for (int j = y; j < y + n; ++j) {
                      if (a[x][y] != a[i][j])
                              return false;
               }
       }
       return true;
}
void solve(int x, int y, int n) {
       if (same(x, y, n)) {
               cout << a[x][y];
       }
       else {
               cout << "(";
               int m = n / 2;
               for (int i = 0; i < 2; ++i) {
                      for (int j = 0; j < 2; ++j) {
                              solve(x + m * i, y + m * j, m);
                      }
               }
               cout << ")";
       }
}
int main(void) {
       int n;
       cin >> n;
       for (int i = 0; i < n; ++i) {
               for (int j = 0; j < n; ++j) {
                      scanf("%1d", &a[i][j]);
               }
       }
       solve(0, 0, n);
       cout << endl;
       return 0;
}


#include <iostream>
using namespace std;
int power2(int k) {
       return (1 << k); //2^k by shift operator
}
int go(int n, int x, int y) {
       if (n == 1) { // repeat devide, and n==1 => finish
               return 2 * x + y;
       }
       else {
               if (x < power2(n - 1)) {
                      if (y < power2(n - 1)) {
                              return go(n - 1, x, y);
                      }
                      else {
                              return go(n - 1, x, y - power2(n - 1)) + power2(2 * n - 2);
                      }
               }
               else {
                      if (y < power2(n - 1)) {
                              return go(n - 1, x - power2(n - 1), y) + power2(2 * n - 2) * 2;
                      }
                      else {
                              return go(n - 1, x - power2(n - 1), y - power2(n - 1)) + power2(2 * n - 2) * 3;
                      }
               }
       }
}
int main(void)
{
       int n, r, c;
       while (cin >> n >> r >> c) {
               cout << go(n, r, c) << '\n';
       }
       return 0;
}a




#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
struct Point {
       int x, y;
       Point() {}
       Point(int x, int y) : x(x), y(y) {
       }
       bool operator < (const Point &v) const {
               if (x == v.x) {
                      return y < v.y;
               }
               else {
                      return x < v.x;
               }
       }
};
bool cmp(const Point &u, const Point &v) {
       return u.y < v.y;
}
int dist(Point p1, Point p2) { //require output is square, so no need root
       return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
}
int bf(vector<Point> &a, int x, int y) {
       int ans = -1;
       for (int i = x; i <= y - 1; ++i) {
               for (int j = i + 1; j <= y; j++) {
                      int d = dist(a[i], a[j]);
                      if (ans == -1 || ans > d) {
                              ans = d;
                      }
               }
       }
       return ans;
}
int cs(vector<Point> &a, int x, int y) {
       int n = y - x + 1;
       if (n <= 3) {
               return bf(a, x, y);
       }
       int mid = (x + y) / 2;
       int left = cs(a, x, mid);
       int right = cs(a, mid + 1, y);
       int ans = min(left, right);
       vector<Point> b;
       for (int i = x; i <= y; ++i) {
               int d = a[i].x - a[mid].x;
               if (d*d < ans) {
                      b.push_back(a[i]);
               }
       }
       sort(b.begin(), b.end(), cmp);
       int m = b.size();
       for (int i = 0; i<m - 1; ++i) {
               for (int j = i + 1; j<m; ++j) {
                      int y = b[j].y - b[i].y;
                      if (y*y < ans) {
                              int d = dist(b[i], b[j]);
                              if (d < ans) {
                                     ans = d;
                              }
                      }
                      else {
                              break;
                      }
               }
       }
       return ans;
}
int main(void)
{
       int n;
       cin >> n;
       vector<Point> a(n);
       for (int i = 0; i<n; ++i) {
               cin >> a[i].x >> a[i].y;
       }
       sort(a.begin(), a.end());
       cout << cs(a, 0, n - 1) << endl;
       return 0;
}



'알고리즘' 카테고리의 다른 글

[DC] 백준 1992 쿼드트리  (0) 2018.04.29
[DC] 백준 1074 Z  (0) 2018.04.29
[DC] 백준 11729 하노이의 탑 이동순서  (0) 2018.04.29
[DC] 백준 6236 용돈관리  (0) 2018.04.29
[DC] 백준 11728 배열 합치기  (1) 2018.04.29


#include <iostream>
using namespace std;
void go(int n, int x, int y) {
       if (n == 0)
               return;
       go(n - 1, x, 6 - x - y);
       cout << x << ' ' << y << '\n';
       go(n - 1, 6 - x - y, y);
}
int main(void)
{
       ios_base::sync_with_stdio(false);
       cin.tie(NULL);
       int n;
       cin >> n;
       cout << (1 << n) - 1 << endl;
       go(n, 1, 3); // 1번에서 3번으로 n개를 옮긴다.
       return 0;
}


'알고리즘' 카테고리의 다른 글

[DC] 백준 1074 Z  (0) 2018.04.29
[DC] 백준 2261 가장 가까운 두 점  (0) 2018.04.29
[DC] 백준 6236 용돈관리  (0) 2018.04.29
[DC] 백준 11728 배열 합치기  (1) 2018.04.29
[DC] 백준 1780 종이의 개수  (0) 2018.04.29


#include <iostream>
#include <algorithm>
#include <limits.h>
using namespace std;
typedef int ll;
ll tb1[100001];
int n, m;
ll go(ll nn) {
       ll cnt = 1;
       int account = nn;
       for (int i = 0; i<n; ++i) {
               if (account - tb1[i] >= 0) {
                      account -= tb1[i];
               }
               else {
                      cnt++;
                      account = nn - tb1[i];
               }
       }
       return cnt;
}
// ll go(ll nn){
//     ll cnt = 1;
//     int account = 0;
//     for(int i=0;i<n;++i){
//             if(account + tb1[i] > nn){
//                    cnt++;
//                    account = tb1[i];
//             }
//             else{
//                    account += tb1[i];
//             }
//     }
//     return cnt;
// }
int main(void) {
       ll sum = 0, maxv = 0;
       cin >> n >> m;
       for (int i = 0; i<n; ++i) {
               cin >> tb1[i];
               maxv = max(maxv, tb1[i]);
       }
       ll left = maxv;
       ll right = 1987654321; // large value
       while (left <= right) {
               ll mid = (left + right) / 2; // mid는 정한 가격
                                                                   //cout << mid << endl;
               int tempv = go(mid);
               if (tempv > m) {
                      left = mid + 1;
               }
               else {
                      right = mid - 1;
               }
       }
       cout << left << endl;
       return 0;
}



#include <iostream>
using namespace std;
int a[1000001];
int b[1000001];
int c[1000001];
int main(void) {
       int n1, n2;
       cin >> n1 >> n2;
       for (int i = 0; i<n1; ++i) {
              cin >> a[i];
       }
       for (int i = 0; i<n2; ++i) {
              cin >> b[i];
       }
       int start = 0;
       int end = n1 + n2 - 1;
       int mid = (start + end) / 2;
       int k = 0;
       int i = 0;
       int j = 0;
       while (i < n1 && j < n2) {
              if (a[i] < b[j]) {
                     c[k++] = a[i++];
              }
              else {
                     c[k++] = b[j++];
              }
       }
       while (i<n1) c[k++] = a[i++];
       while (j<n2) c[k++] = b[j++];
       for (int i = 0; i<k; ++i) {
              cout << c[i] << ' ';
       }
       return 0;
}


'알고리즘' 카테고리의 다른 글

[DC] 백준 11729 하노이의 탑 이동순서  (0) 2018.04.29
[DC] 백준 6236 용돈관리  (0) 2018.04.29
[DC] 백준 1780 종이의 개수  (0) 2018.04.29
[BS] 백준 2512 예산  (0) 2018.04.29
[BS] 백준 1939 중량제한  (0) 2018.04.29


#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <limits.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
int n;
int ans[3];
int tb2[3001][3001];
bool same(int x, int y, int k) {
       for (int i = x; i<x + k; ++i) {
              for (int j = y; j<y + k; ++j) {
                     if (tb2[i][j] != tb2[x][y])
                     {
                           return false;
                     }
              }
       }
       return true;
}
void go(int x, int y, int k) {
       if (same(x, y, k)) {
              ans[tb2[x][y] + 1] += 1;
              return;
       }
       for (int ii = 0; ii<3; ++ii) {
              for (int jj = 0; jj<3; ++jj) {
                     go(x + ii * (k / 3), y + jj * (k / 3), k / 3);
              }
       }
}
int main(void) {
       cin >> n;
       for (int i = 0; i<n; ++i) {
              for (int j = 0; j<n; ++j) {
                     cin >> tb2[i][j];
              }
       }
       go(0, 0, n);
       for (int i = 0; i<3; ++i) {
              cout << ans[i] << endl;
       }
       return 0;
}


'알고리즘' 카테고리의 다른 글

[DC] 백준 6236 용돈관리  (0) 2018.04.29
[DC] 백준 11728 배열 합치기  (1) 2018.04.29
[BS] 백준 2512 예산  (0) 2018.04.29
[BS] 백준 1939 중량제한  (0) 2018.04.29
[BS] 백준 1561 놀이공원  (0) 2018.04.29

이해가 썩 잘 되진 않는다. 주석을 달아봐야겠다
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <limits.h>

using namespace std;

typedef unsigned long long ull;
typedef long long ll;

int n;
int tb1[100001];
int tb2[1001][1001];
int che2[1001][1001];
ull che1[100001];

ull go(int idx, int sum){
    
}

int main(void){
    //input
    cin >> n;
    for(int i=0;i<n;++i){
        cin >> tb1[i];
    }
    int total;
    cin >> total;


    //no exceed case
    int tmp = total;
    int max_money = 0;

    //cal maxmoney
    for(int i=0;i<n;++i){
        tmp -= tb1[i]; // 예산이 충분한지
        max_money = tb1[i] > max_money ? tb1[i] : max_money;
    }

    if(tmp >= 0){ // 예산이 충분하면 가장 큰 돈을 출력
        return cout << max_money, 0;
    }



    //BS phase
    //적당한 예산을 구하는 과정이다. 우선 절반값으로 둔다.
    int left = total/n;
    int right = max_money;

    while(left<=right){
        int mid = (left + right) / 2;
        tmp = total;

        for(int i=0;i<n;++i){
            if(mid>=tb1[i]) tmp -= tb1[i];
            else tmp -= mid;
        }
        if(tmp>=0) left = mid + 1;
        else right = mid - 1;
    }
    cout << right;

    return 0;
}


// while(left<=right){
//         int mid = (left+right) / 2; // 새로 설정한 예산한도
//         tmp = total;

//         for(int i=0;i<n;++i){
//             if(mid >= tb1[i]) tmp -= tb1[i]; // 예산한도 아래면 그대로
//             else tmp -= mid; // 초과면 예산한도 만큼
//         }
//         if(tmp >= 0) left = mid+1; // 예산초과하지 않았다.
//         else right = mid - 1; // 초과했다.
//     }
//     cout << right;


'알고리즘' 카테고리의 다른 글

[DC] 백준 11728 배열 합치기  (1) 2018.04.29
[DC] 백준 1780 종이의 개수  (0) 2018.04.29
[BS] 백준 1939 중량제한  (0) 2018.04.29
[BS] 백준 1561 놀이공원  (0) 2018.04.29
[BS] 백준 3020 개똥벌레  (0) 2018.04.29

백준 강의 코드.

이분탐색 쉬운 것 같다. 
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <limits.h>
#include <map>
#include <stdlib.h>

using namespace std;

typedef unsigned long long ull;
typedef long long ll;

int n,m,st,endd;
int tb1[100001];
int tb2[1001][1001];
int che2[1001][1001];
ull che1[100001];
string s[100001];

vector< pair<int,int> > a[10001];
bool visited[10001];

bool dfs(int idx, int limit){
    if(visited[idx]){
        return false;
    }
    visited[idx] = true;

    if(idx == endd) {
        return true;
    }

    for(int i=0;i<a[idx].size();++i){
        int next = a[idx][i].first;
        int cost = a[idx][i].second;
        if(cost >= limit){
            if(dfs(next, limit)){
                return true;
            }
        }
    }
    return false;
}

int main(void){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> m;
    for(int i=0;i<m;++i){
        int x,y,z;
        cin >> x >> y >> z;
        a[x].push_back(make_pair(y,z));
        a[y].push_back(make_pair(x,z));
    }
    cin >> st >> endd;
    int left, right;
    left = 1;
    right = 1000000000;
    int ans = 0;

    while(left <= right){
        // cout << "left : " << left << endl;
        // cout << "rt : " << right << endl;
        int mid = left + (right - left) / 2;
        memset(visited, false, sizeof(visited));
        if(dfs(st,mid)){    
            ans = mid;
            left = mid + 1;
        }
        else{
            right = mid - 1;
        }

    }
    cout << ans << endl;
    return 0;
}



'알고리즘' 카테고리의 다른 글

[DC] 백준 1780 종이의 개수  (0) 2018.04.29
[BS] 백준 2512 예산  (0) 2018.04.29
[BS] 백준 1561 놀이공원  (0) 2018.04.29
[BS] 백준 3020 개똥벌레  (0) 2018.04.29
[BS] 백준 1300 k번째 수  (0) 2018.04.29

+ Recent posts