로그인 유지
소스코드 저장을 안해두니까 제가 다 짜서 올려야 하는군요 -_-;;;A번 소스 코드.
#include <cstdio> #include <cstring> #include <string> #include <iostream> using namespace std; int card[4][13]; int sum[4]; int dsum[14]; string suit[4] = {"Spades", "Hearts", "Diamonds", "Clubs"}; string no = "23456789TJQKA"; string go() { int hcp = 0; for (int i = 9; i < 13; i++) for (int j = 0; j < 4; j++) hcp += card[j][i] * (i - 8); // rule 1 if (hcp >= 10) for (int i = 0; i < 4; i++) if (sum[i] >= 8) return "4 " + suit[i]; // rule 2 if (hcp >= 10 && hcp <= 13) for (int i = 0; i < 4; i++) if (sum[i] == 7) return "3 " + suit[i]; // rule 3 if (hcp >= 8 && hcp <= 9) for (int i = 0; i < 2; i++) // Spades or Hearts if (sum[i] >= 7) return "2 " + suit[i]; // rule 4 if (hcp >= 8 && hcp <= 11) for (int i = 0; i < 2; i++) // Spades or Hearts if (sum[i] == 6) return "2 " + suit[i]; // rule 5 if (hcp >= 11 && hcp <= 15) { if ((dsum[4] == 3 && dsum[1] == 1) || // 4-4-4-1 (dsum[5] == 1 && dsum[4] == 2)) { // 5-4-4-0 if (sum[0] >= 4) return "2 Diamonds"; } } // rule 6 if (hcp >= 15 && hcp <= 17) { if ((dsum[4] == 1 && dsum[3] == 3) || // 4-3-3-3 (dsum[4] == 2 && dsum[3] == 1) || // 4-4-3-2 (dsum[5] == 1 && dsum[3] == 2)) { // 5-3-3-2 int stopped = 0; for (int i = 0; i < 4; i++) { if ((card[i][12] == 1) || (card[i][11] == 1 && sum[i] >= 2) || (card[i][10] == 1 && sum[i] >= 3) || (card[i][9] == 1 && sum[i] >= 4)) stopped++; } if (stopped >= 3) return "1 No Trump"; } } // rule 7 if (hcp >= 20 && hcp <= 22) { if ((dsum[4] == 1 && dsum[3] == 3) || // 4-3-3-3 (dsum[4] == 2 && dsum[3] == 1) || // 4-4-3-2 (dsum[5] == 1 && dsum[3] == 2)) { // 5-3-3-2 return "2 No Trump"; } } // rule 8 if (hcp >= 22) return "2 Clubs"; // rule 9 if (hcp >= 13 && hcp <= 16) { if (sum[0] >= 5 || sum[1] >= 5) { if (sum[0] >= sum[1]) return "1 Spades"; return "1 Hearts"; } if (sum[2] >= sum[3]) return "1 Diamonds"; return "1 Clubs"; } // reverse-rule if (hcp >= 17) { for (int i = 13; i >= 0; i--) if (dsum[i] != 0) for (int j = 3; j >= 0; j--) if (sum[j] == i) return "1 " + suit[j]; } return "Pass"; } int main() { int Q = 0; while (true) { memset(card, 0, sizeof(card)); memset(sum, 0, sizeof(sum)); memset(dsum, 0, sizeof(dsum)); for (int i = 0; i < 13; i++) { string s; if (!(cin >> s)) return 0; int a, b; for (int j = 0; j < 4; j++) if (suit[j][0] == s[0]) a = j; for (int j = 0; j < 13; j++) if (no[j] == s[1]) b = j; card[a][b]++; sum[a]++; } for (int i = 0; i < 4; i++) dsum[sum[i]]++; printf("Hand #%d: %s\n", ++Q, go().c_str()); } }
B번 소스 코드.
#include <cstdio> using namespace std; int main() { int N, w, d, m; while (scanf("%d %d %d %d", &N, &w, &d, &m) == 4) { int t = (N * (N - 1) / 2) * w; printf("%d\n", (t == m) ? (N) : ((t - m) / d)); } }
C번 소스 코드.
#include <algorithm> #include <cstdio> using namespace std; pair<int, int> a[5001]; pair<int, int> b[5001]; void go(int f, int s) { if (f == 0) { if (a[s].second == 1) { for (int i = 0; i < s; i++) printf("|"); } else { go(0, a[s].second); printf("x"); go(0, s / a[s].second); } } else { if (b[s].second == 0) { go(0, s); } else { go(1, s - b[s].second); printf("+"); go(1, b[s].second); } } } int main() { for (int i = 1; i <= 5000; i++) { a[i] = make_pair(i, 1); for (int j = 2; j * j <= i; j++) { if ((i % j) != 0) continue; if (a[j].first + a[i / j].first + 2 < a[i].first) { a[i].first = a[j].first + a[i / j].first + 2; a[i].second = j; } } } for (int i = 1; i <= 5000; i++) { b[i] = make_pair(a[i].first, 0); for (int j = 1; 2 * j <= i; j++) { if (b[j].first + b[i - j].first + 2 < b[i].first) { b[i].first = b[j].first + b[i - j].first + 2; b[i].second = j; } } } int N; while (scanf("%d", &N) == 1) { printf("%d toothpicks: ", b[N].first); go(1, N); printf("=%d\n", N); } }
D번 소스 코드.
#include <cstdio> #include <vector> #include <algorithm> using namespace std; vector <pair<int, int> > g; vector <int> a, c; int go(vector<int> a) { vector <int> r; for (int i = 0; i < a.size(); i++) { int pos = lower_bound(r.begin(), r.end(), a[i]) - r.begin(); if (pos == r.size()) r.push_back(a[i]); else r[pos] = a[i]; } return a.size() - r.size(); } int main() { int n; while (scanf("%d", &n) == 1) { if (n == 0) break; g.resize(n); for (int i = 0; i < n; i++) { scanf(" %d %d", &g[i].first, &g[i].second); g[i].first--; g[i].second--; } a.clear(); c.assign(n, 0); int now = 0; while (true) { if (c[now] == 1) break; a.push_back(now); c[now] = 1; now = ((c[g[now].first] == 0) ? g[now].first : g[now].second); } if (a.size() == n) { printf("Knot solvable.\n"); int ret = n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) c[(a[j] + i) % n] = j; ret <?= go(c); reverse(c.begin(), c.end()); ret <?= go(c); } printf("%d\n", ret); } else { printf("Not solvable.\n"); } } }
E번 소스 코드.
#include <cstdio> #include <vector> using namespace std; int main() { int n; while (scanf("%d", &n) == 1) { if (n == 0) break; vector<int> a(n, 0); for (int i = 0; i < n; i++) { int v; scanf("%d", &v); for (int j = 0; j < n; j++) { if (a[j] == 0) { if (v == 0) { a[j] = i + 1; break; } v--; } } } for (int i = 0; i < n - 1; i++) printf("%d,", a[i]); printf("%d\n", a[n - 1]); } }
F번 소스 코드.
#include <cstdio> #include <algorithm> #include <queue> #include <cstring> using namespace std; struct triplet { int a, b, c; triplet(int ia = 0, int ib = 0, int ic = 0) : a(ia), b(ib), c(ic) {} }; int a[61][61][61]; int b[61][61][61]; int c[61][61][61]; int main() { memset(a, -1, sizeof(a)); queue<triplet> Q; for (int i = 0; i <= 20; i++) { Q.push(triplet(i, i, i)); a[i][i][i] = i; b[i][i][i] = i; c[i][i][i] = i; } while (!Q.empty()) { triplet now = Q.front(), next; Q.pop(); for (int i = 0; i < 3; i++) { int half; if (i==0) half=now.a; else if (i==1) half=now.b; else half=now.c; if (half % 2 == 1) continue; else half /= 2; for (int j = 0; j < 3; j++) { if (i == j) continue; next = now; if (i==0) next.a-=half; else if (i==1) next.b-=half; else next.c-=half; if (next.a < 0 || next.b < 0 || next.c < 0) continue; if (j==0) next.a+=half; else if (j==1) next.b+=half; else next.c+=half; if (a[next.a][next.b][next.c] == -1) { a[next.a][next.b][next.c] = now.a; b[next.a][next.b][next.c] = now.b; c[next.a][next.b][next.c] = now.c; Q.push(next); } } } } int x, y, z, nx, ny, nz; while (scanf("%d %d %d", &x, &y, &z) == 3) { while (x != -1) { printf("%4d%4d%4d\n", x, y, z); nx = a[x][y][z]; ny = b[x][y][z]; nz = c[x][y][z]; if (x == nx && y == ny && z == nz) break; x = nx, y = ny, z = nz; } printf("============\n"); } }
G번 소스 코드.
#include <cstdio> #include <vector> #include <algorithm> using namespace std; #define EPS 1e-9 #define abs(x) (((x) > 0) ? (x) : -(x)) struct Point { double x, y; Point(double a = 0.0, double b = 0.0) : x(a), y(b) {} bool operator == (const Point &a) const { return (abs(x - a.x) < EPS) && (abs(y - a.y) < EPS); } }; bool lowerLeft(const Point& a, const Point& b) { if (a.y < b.y) return true; if (a.y > b.y) return false; if (a.x < b.x) return true; if (a.x > b.x) return false; return false; } inline double isLeft(const Point& p0, const Point& p1, const Point& p2) { return ( (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y) ); } double dist(const Point& a, const Point& b) { return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); } Point o; bool angleComp(const Point& a, const Point& b) { double v = isLeft(o, a, b); if (v > 0) return true; if (v < 0) return false; return dist(o, a) < dist(o, b); } vector<Point> convex(vector<Point> a) { if (a.size() < 3) return a; vector<Point> r; r.clear(); int n = a.size(); sort(a.begin(), a.end(), lowerLeft); a.erase(unique(a.begin(), a.end()), a.end()); o = a[0]; sort(a.begin() + 1, a.end(), angleComp); a.push_back(a[0]); int top = 2; r.push_back(a[0]); r.push_back(a[1]); for (int i = 2; i <= n; i++) { while(top > 1 && isLeft(r[top - 2], r[top - 1], a[i]) <= 0) { r.pop_back(); top--; } r.push_back(a[i]); top++; } r.pop_back(); top--; return r; } vector <Point> a, b; bool check() { int c[3], d[3]; for (int i = 0; i < a.size(); i++) { for (int j = 0; j < b.size(); j++) { double p; c[0] = c[1] = c[2] = d[0] = d[1] = d[2] = 0; for (int k = 0; k < a.size(); k++) { p = isLeft(a[i], b[j], a[k]); if (p < -EPS) c[0] = 1; else if (p > EPS) c[2] = 1; else c[1] = 1; } if (c[0] + c[2] == 2) continue; for (int k = 0; k < b.size(); k++) { p = isLeft(a[i], b[j], b[k]); if (p < -EPS) d[0] = 1; else if (p > EPS) d[2] = 1; else d[1] = 1; } if (d[0] + d[2] == 2) continue; if (c[0] + d[0] == 2 || d[2] + d[2] == 2) continue; return true; } } return false; } int main() { int n, m, Q = 0; while (scanf("%d %d", &n, &m) == 2) { if (n == 0 && m == 0) break; a.clear(), b.clear(); int sx, sy, ex, ey; for (int i = 0; i < n; i++) { scanf("%d %d %d %d", &sx, &sy, &ex, &ey); a.push_back(Point(sx, sy)); a.push_back(Point(sx, ey)); a.push_back(Point(ex, sy)); a.push_back(Point(ex, ey)); } for (int i = 0; i < m; i++) { scanf("%d %d %d %d", &sx, &sy, &ex, &ey); b.push_back(Point(sx, sy)); b.push_back(Point(sx, ey)); b.push_back(Point(ex, sy)); b.push_back(Point(ex, ey)); } a = convex(a); b = convex(b); if (Q) printf("\n"); printf("Case %d: ", ++Q); if (check()) { printf("It is possible to separate the two groups of vendors.\n"); } else { printf("It is not possible to separate the two groups of vendors.\n"); } } }
H번 소스 코드.
#include <cstdio> using namespace std; double a[101]; int main() { int n; a[2] = 1.0; for (int i = 4; i <= 100; i += 2) a[i] = a[i - 2] * (i - 2) / (i - 1); while (scanf("%d", &n) == 1) { printf("%.5lf\n", a[n]); } }
I번 소스 코드.
#include <cstdio> #include <string> #include <vector> #include <algorithm> using namespace std; #define REP(i, n) for(int i = 0; i < (n); ++i) #define sz(x) ((x).size()) char tmp[13]; struct Matrix { vector<long long> left; vector<long long> right; bool check() { REP(i, sz(left)) if (left[i] != 0) return false; return true; } }; int main() { int n; while (scanf("%d", &n) == 1 && n) { vector <string> a(n); vector <Matrix> T(n); string S = ""; for (int i = 0; i < n; i++) { scanf("%s", &tmp); a[i] = tmp; S += a[i]; } sort(S.begin(), S.end()); S.erase(unique(S.begin(), S.end()), S.end()); REP(i, n) { T[i].left.assign(sz(S), 0); T[i].right.assign(n, 0); REP(j, sz(a[i])) T[i].left[S.find(a[i][j])]++; T[i].right[i] = 1; } int last = 0; REP(i, sz(S)) { bool sw = false; for (int j = i; j < n; j++) { if (T[j].left[i] != 0) { swap(T[last], T[j]); sw = true; break; } } if (!sw) continue; for (int j = last + 1; j < n; j++) { if (T[j].left[i] != 0) { long long g = __gcd(T[last].left[i], T[j].left[i]); long long l = T[last].left[i] * T[j].left[i] / g; long long v1 = l / T[last].left[i]; long long v2 = l / T[j].left[i]; REP(k, sz(S)) T[j].left[k] = v1 * T[last].left[k] - v2 * T[j].left[k]; REP(k, n) T[j].right[k] = v1 * T[last].right[k] - v2 * T[j].right[k]; } } last++; if (last == n) break; } bool sw = false; REP(i, n) { if (T[i].check()) { sw = true; printf("yes\n"); REP(j, n) { printf("%s", a[j].c_str()); long long v = T[i].right[j]; if (v < 0) printf(" L %lld\n", -v); if (v > 0) printf(" R %lld\n", v); if (v == 0) printf(" N 0\n"); } break; } } if (!sw) printf("no\n"); } }