ABC 189 간단 후기 올립니다~ (atcoder.jp/contests/abc189)
A - Slot
간단한 구현 문제입니다.
int main() {
string s; cin >> s;
if (s[0] == s[1] && s[0] == s[2]) cout << "Won";
else cout << "Lost";
}
B - Alcoholic
1번 부터 순차적으로 마시면서 alcohol이 X가 넘는 순간을 찾으면 됩니다. x에 100을 곱해서 소수점 계산을 피했습니다.
int main() {
int n, x; cin >> n >> x; x *= 100;
int sum = 0;
for (int i = 1; i <= n; i++) {
int a, b;
cin >> a >> b;
sum += a * b;
if (sum > x) {
cout << i; return 0;
}
}
cout << -1;
}
C - Mandarin Orange
모든 l, r에 대한 A[l..r] 최소값 * (r-l+1) 중 최대값을 출력하면 됩니다.
(l, r) 순서쌍이 O(N^2), A[l..r] 최소값은 스위핑을 이용하여 O(1)에 구할수 있습니다. (전체 시간 복잡도 : O(N^2))
참고로, 분할정복으로 O(NlogN) , stack을 이용하여 O(N) 으로 구할 수 있을거 같습니다.
ll x[10004];
int main() {
int i, j, n; cin >> n;
ll ans = 0, mn;
for (i = 1; i <= n; i++) cin >> x[i];
for (i = 1; i <= n; i++) {
mn = (ll)1e9;
for (j = i; j <= n; j++) {
mn = min(mn, x[j]);
ans = max(ans, (ll)(j - i + 1)*mn);
}
}
cout << ans;
}
D - Logical Expression
DP로 해결했습니다.
int n;
string x[1000];
ll dp[1000][2]; // 0=false, 1=true
int main() {
int i; cin >> n;
for (i = 0; i < n; i++) cin >> x[i];
dp[n][1] = 1; dp[n][0] = 0;
for (i = n - 1; i >= 0; i--) {
if (x[i].compare("AND") == 0) {
dp[i][0] = dp[i + 1][0] * 2;
dp[i][1] = dp[i + 1][0] + dp[i + 1][1];
}
else {
dp[i][0] = dp[i + 1][0] + dp[i + 1][1];
dp[i][1] = dp[i + 1][1] * 2;
}
}
cout << dp[0][0] + dp[0][1] << '\n';
}
E - Rotate and Flip
연산 1,2,3,4을 원점(0,0), x축(1,0), y축(0,1)에 적용하여 시간복잡도를 O(N+M+Q)로 개선했습니다.
typedef pair<ll, ll> p;
p O[200004], X[200004], Y[200004], xy[200004];
int N, M;
void rotate_one(p &src, p &dst, int op) {
if (op == 1) {
dst.x = src.y;
dst.y = -src.x;
}
else {
dst.x = -src.y;
dst.y = src.x;
}
}
void rotate_xy(int idx, int op) {
rotate_one(O[idx - 1], O[idx], op);
rotate_one(X[idx - 1], X[idx], op);
rotate_one(Y[idx - 1], Y[idx], op);
}
void flip_one(p &src, p &dst, int op, ll center) {
// vertical flip
if (op == 3) {
ll dx = center - src.x;
dst.x = src.x + dx * 2;
dst.y = src.y;
}
// horizontal flip
else {
ll dy = center - src.y;
dst.x = src.x;
dst.y = src.y + dy * 2;
}
}
void flip_xy(int idx, int op, ll center) {
flip_one(O[idx - 1], O[idx], op, center);
flip_one(X[idx - 1], X[idx], op, center);
flip_one(Y[idx - 1], Y[idx], op, center);
}
void solve(p &oo, p&xx, p &yy, p &src, p &dst) {
dst.x = oo.x; dst.y = oo.y;
ll dx, dy;
// x축
dx = xx.x - oo.x; dy = xx.y - oo.y;
dst.x += dx * src.x;
dst.y += dy * src.x;
// y축
dx = yy.x - oo.x; dy = yy.y - oo.y;
dst.x += dx * src.y;
dst.y += dy * src.y;
}
int main() {
O[0] = { 0,0 }, X[0] = { 1,0 }, Y[0] = { 0,1 };
int i;
cin >> N;
for (i = 1; i <= N; i++) cin >> xy[i].x >> xy[i].y;
cin >> M;
for (i = 1; i <= M; i++) {
int op; cin >> op;
if (op <= 2) rotate_xy(i, op);
else {
int a; cin >> a;
flip_xy(i, op, a);
}
}
int q; cin >> q;
while (q--) {
int a, b; cin >> a >> b;
p dst;
solve(O[a], X[a], Y[a], xy[b], dst);
cout << dst.x << ' ' << dst.y << '\n';
}
}
'코딩 > 코딩 대회 후기' 카테고리의 다른 글
AtCoder Beginner Contest 190 후기 (0) | 2021.01.31 |
---|---|
Google Code jam Round 1C 2019 후기 (0) | 2019.05.06 |
Google Code jam Round 1B 2019 후기 (0) | 2019.04.30 |
Google Code jam Round 1A 2019 후기 (0) | 2019.04.14 |