소스코드 저장을 안해두니까 제가 다 짜서 올려야 하는군요 -_-;;;
A번 소스 코드.
[spoiler="더 보기..."]
~~~ cpp
#include
#include
#include
#include
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());
}
}
[/spoiler]
B번 소스 코드.
[spoiler="더 보기.."]
~~~ cpp
#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));
}
}
[/spoiler]
C번 소스 코드.
[spoiler="더 보기..."]
~~~ cpp
#include
#include
using namespace std;
pair a[5001];
pair 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);
}
}
[/spoiler]
D번 소스 코드.
[spoiler="더 보기..."]
~~~ cpp
#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");
}
}
}
[/spoiler]
E번 소스 코드.
[spoiler="더 보기..."]
[code]
#include
#include
using namespace std;
int main() {
int n;
while (scanf("%d", &n) == 1) {
if (n == 0) break;
vector 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]);
}
}
[/code]
[/spoiler]
F번 소스 코드.
[spoiler="더 보기..."]
~~~ cpp
#include
#include
#include
#include
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 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");
}
}
[/spoiler]
G번 소스 코드.
[spoiler="더 보기..."]
~~~ cpp
#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");
}
}
}
[/spoiler]
H번 소스 코드.
[spoiler="더 보기..."]
~~~ cpp
#include
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]);
}
}
[/spoiler]
I번 소스 코드.
[spoiler="더 보기..."]
~~~ cpp
#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");
}
}
astein
소스코드 저장을 안해두니까 제가 다 짜서 올려야 하는군요 -_-;;;
A번 소스 코드.
[spoiler="더 보기..."]
~~~ cpp
#include
#include
#include
#include
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());
}
}
[/spoiler]
C번 소스 코드.
[spoiler="더 보기..."]
~~~ cpp
#include a[5001]; b[5001];
#include
using namespace std;
pair
pair
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);
}
}
[/spoiler] a(n, 0);
E번 소스 코드.
[spoiler="더 보기..."]
[code]
#include
#include
using namespace std;
int main() {
int n;
while (scanf("%d", &n) == 1) {
if (n == 0) break;
vector
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]);
}
}
[/code]
[/spoiler]
F번 소스 코드.
[spoiler="더 보기..."]
~~~ cpp
#include Q;
#include
#include
#include
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
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");
}
}
[/spoiler]
H번 소스 코드.
[spoiler="더 보기..."]
~~~ cpp
#include
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]);
}
}
[/spoiler]
18년 전