devonnuri.wiki

Neowise Labs Contest 1 (Codeforces Round 1018, Div. 1 + Div. 2) 후기

입력 2025-05-05 06:33:25

수정 2025-05-05 06:33:25

A, B를 해결했고 C를 업솔빙했다.

A : Wonderful Sticks

  • <가 나오면 최솟값을 낮추고, >가 나오면 최댓값을 올리는 식으로 구성한다.
  • 마지막에 최솟값이 1이 되도록 조정해준다.
#include <bits/stdc++.h>
using namespace std;
 
using vi = vector<int>;
 
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
 
  int T; cin >> T;
  while (T--) {
    int n; cin >> n;
    string s; cin >> s;
    vi ans(n);
    int l=0, r=0;
    for (int i=0;i<n-1;i++) {
      if (s[i] == '<') {
        ans[i+1]=--l;
      } else {
        ans[i+1]=++r;
      }
    }
 
    for (int i=0;i<n;i++)
      cout << ans[i]-l+1 << ' ';
    cout << '\n';
  }
 
  return 0;
}

B : Wonderful Gloves

  • 영어 독해가 어렵다.
  • 예제를 하나씩 뜯어보면서 해야 하는데, 코드부터 짜려고 한 게 푸는데 시간이 좀 걸린 이유가 되겠다.
  • (답) = (장갑 쌍을 얻기 위해 필요한 최소 낱개 수) = (장갑 쌍을 만드는 최대 낱개 수)
  • 쌍을 만드는 것을 방해하는 악마에 빙의하여 개의 쌍이 되도록 하는 worst case를 떠올려 보자.
    • 개의 쌍은 가 가장 큰 색 로 만들자.
    • 나머지 색의 장갑은 쌍을 만들면 안되니까, 를 뽑는 경우를 생각하자.
  • 다르게 말하면, 전체 합에서 쌍을 없애버리는 색 개를 골라서 빼야 한다.
    • worst case니까 이 빼게 될 낱개를 최소화해야 한다.
    • 를 오름차순으로 정렬해서 작은 순으로 개를 골라서 빼자.
#include <bits/stdc++.h>
using namespace std;
 
using ll = long long;
using vi = vector<int>;
 
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
 
  int T; cin >> T;
  while (T--) {
    int n, k; cin >> n >> k;
    vector<array<int, 2>> l(n);
    for (int i=0;i<n;i++)
      cin >> l[i][0];
    for (int i=0;i<n;i++)
      cin >> l[i][1];
 
    ll ans=1;
    vi mins(n);
    for (int i=0;i<n;i++) {
      ans += l[i][0]+l[i][1];
      mins[i] = min(l[i][0], l[i][1]);
    }
 
    sort(mins.begin(), mins.end());
 
    for (int i=0;i<n-k+1;i++)
      ans-=mins[i];
 
    cout << ans << '\n';
  }
 
  return 0;
}