코드#include #include using namespace std;int n, l, a[10003],res;int main() { cin >> n >> l; for(int i = 0; i > a[i]; sort(a, a + n); for(int i = 0; i l) break; // 더이상 먹을 수 없으면 break } cout 풀이정렬을 해서, 새의 키보다 낮은 높이에 있는 과일을 먹으면 된다. 정렬이 싫으면 우선순위 큐로 최소힙을 구성해, 작은 거부터 꺼내먹어도 무방하다.
전체 글
Hello World코드#include #include using namespace std;typedef long long ll;const ll MOD = 1000000000;ll n,k,dp[203][203];ll go(int sum,int cnt) { if(sum > n) return 0; if(cnt == k) { return sum == n ? 1 : 0; // 합이 일치하면 1, 아니면 0 반환 } ll &ret = dp[sum][cnt]; if(ret != -1) return ret; // 메모이제이션 ret = 0; for(int i = 0; i > n >> k; memset(dp, -1, sizeof(dp)); cout 풀이합을 분해하는 경우의 수..
코드#include #include using namespace std;const int dx[] = {1,-1,0,0};const int dy[] = {0,0,1,-1};int n,m,a[503][503],dp[503][503];int go(int x, int y, int height) { if(x == n - 1 && y == m - 1) return 1; // 도착하면 1 반환 int &ret = dp[x][y]; if(ret != -1) return ret; // 메모이제이션 ret = 0; // 길이 없다면 0으로 표현해주어야함 // 상하좌우 탐색 for(int i = 0; i = n || ny >= m || nx = a[x][y]) continue; ..
코드#include #include using namespace std;int r, c;char a[10003][503];bool visited[10003][503];// DFS를 이용하여 파이프 경로 찾기bool go(int row, int col) { // 범위를 벗어나거나, 건물('x')일 경우 탐색 불가 if (row = r || a[row][col] == 'x') return false; // 이미 방문한 경우 탐색 불가 if (visited[row][col]) return false; // 현재 칸을 방문했다고 표시 visited[row][col] = true; // 마지막 열에 도달하면 성공적으로 파이프를 설치한 것 if (col == c - 1) ..
코드#include #include using namespace std;string s, res;int charCount[26];void constructPalindrome(int oddIdx) { // 절반 부분 추가 for(int i = 0; i = 0; i--) { int halfCount = charCount[i] / 2; res += string(halfCount, char(i + 'A')); }}int main() { cin >> s; int oddCount = 0, oddIdx = -1, len = s.length(); // 각 문자의 개수 카운트 for(int i = 0; i 1) || (len % 2 == 0 && oddCo..
코드#include #include #include using namespace std;int n,x,y, dp[17][1003]; // 상태값은 day와 value 2가지pair a[17];int go(int day, int value) { if(day >= n + 1) return 0; if(dp[day][value] != -1) return dp[day][value]; int &ret = dp[day][value]; int include = 0; // 일을 하는 경우 if(day + a[day].first > n; memset(dp, -1, sizeof(dp)); for(int i = 1; i > x >> y; a[i] = {x,y}; }..
코드#include #include using namespace std;int tc, a[3];int main() { cin >> tc; while(tc--) { string res; fill(a, a + 3, 0); for(int i = 0; i > a[i]; int floor = (a[2] - 1) % a[0] + 1; // 0 기반으로 구하기 int room = (a[2] - 1) / a[0] + 1; // 0 기반으로 구하기 res = to_string(floor) + (room 풀이 1기반으로 해결하려고 하다가 엣지 케이스에서 털리던 중에, 0기반으로 해결하면 된다는 사실을 알았다. 0기반 인덱싱을 사용하면 인..
코드#include #include #include #include using namespace std;typedef long long ll;int n,x,y;vector> v;int main() { cin >> n; for(int i = 0; i > x >> y; v.push_back({x,y}); } for(int i = 0; i 풀이데이터의 수가 50이라, 모든 경우를 탐색하는 걸로 해결 가능하다. 처음에는 sort 해서 풀려고 하다가 실패. 엄청 헤매다가 완전탐색으로 할 수 있다는 생각이 든 이후 허탈해졌다. 역시 제일 처음에 완전탐색으로 할 수 있는지를 고려하는 게 맞다.
#include #include #include using namespace std;int n,x;double m,y;pair a[5003];int dp[10003];int main() { while(1) { cin >> n >> m; if(n == 0 && m == 0) break; fill(a, a+5003, make_pair(0,0)); fill(dp, &dp[0]+10003, 0); for(int i = 0; i > x >> y; a[i].first = x; a[i].second = y; } for(int i = 0; i 풀이무난한 배낭문제...라고 생각했으나 소수점..
코드#include using namespace std;int n,k,a[103],dp[10003];int main() { cin >> n >> k; for(int i = 0; i > a[i]; fill(dp, dp + 10003, 987654321); // 최소 개수를 찾아야 해서 큰 값으로 초기화 dp[0] = 0; // 0원을 만들 때 필요한 동전의 개수는 0개 for(int i = 0; i 풀이j원을 만들 때 필요한 동전의 개수 구하기 문제이다. dp[j]는 현재까지 구한 j원을 만드는 최소 동전 개수이다. dp[j - a[i]] + 1은 j - a[i]원을 만드는 최소 동전 개수에 a[i] 동전을 추가한 것이다. 따라서, dp[j]는 dp[j]와 dp[j - a[i]]..