AtCoder Beginner Contest 193

dohoon·2021년 2월 28일
0

AtCoder

목록 보기
3/3


3솔했다.
D번은 그냥 사설 보고 업솔빙했다.
구현을 왤케 못하는지... 넘 슬프다.
C번도 짜증난게, 너무 뻘짓을 했다...

A. Discount

퍼센트 출력

void solve() {
    double a, b; cin >> a >> b;
    double ans = 1-b/a;
    cout.precision(4); cout << fixed;
    cout << ans*100;
}

B. Play Snuke

그냥 시키는 대로.

void solve() {
    int n; cin >> n;
    int a[n], p[n], x[n];
    int ans = INT_MAX;
    REPh(i,0,n) {
        cin >> a[i] >> p[i] >> x[i];
        if (x[i] > a[i]) {
            ans = min(ans, p[i]);
        }
    }
    cout << (ans == INT_MAX ? -1 : ans);
}

C. Unexpressed

에라토스테네스 체로만 생각했다.
도대체 왜 그랬는지 모르겠다. 최근에 소수 문제들만 풀어댄 것이 원인이 아닐까...
nn까지 하면 무조건 시간초과라 n\sqrt n까지 도는 식으로 하면 된다.

void solve() {
    ll n; cin >> n;
    set<ll> s;
    for (ll a = 2; a*a <= n; ++a) {
        for (ll ab = a*a; ab <= n; ab *= a) {
            s.emplace(ab);
        }
    }
    cout << n-s.size();
}

D. Poker

다음과 같이 엄청 뻘짓을 했다.
뭐가 문제인지 아직 모르겠다.
난 말리면 한없이 말려서
그냥 포기하고 답지를 봤다.

구현이 어려운 문제이고,
에디토리얼의 코드는 보지 않는 것을 추천한다. UB를 대수롭지 않게 넘기는 부분이 있기 때문이다.

ll score(string S) {
    ll cnt[10];
    iota(cnt+1, cnt+10, 1);
    for(char c : S) cnt[c - '0'] *= 10;
    return accumulate(cnt+1, cnt+10, 0);
}

void solve() {
    int k;
    string s, t;
    cin >> k >> s >> t;
    ll cnt[10]; fill(cnt+1, cnt+10, k);
    for(char c : s.substr(0,4)) cnt[c - '0']--;
    for(char c : t.substr(0,4)) cnt[c - '0']--;
    ll win = 0;
    REPh(x,1,10) REPh(y,1,10) {
        s.back() = '0' + x; t.back() = '0' + y;
        if(score(s) <= score(t)) continue;
        win += cnt[x] * (cnt[y] - (x == y));
    }
    cout << (double)win/(9*k-8)/(9*k-9);
}

실제 돌아가는 거에서 다른 점은
cic_i를 난 NN개짜리 인덱스 있는 배열에 맞춰서 비교했고
정답 코드는 10개짜리로 비교했다는 것이다.
사실 그 때 졸았음을 부정하지는 않겠다. 워낙 코드가 망해서 졸 수밖에 없었다.

담에는 4솔 해야지...

profile
이 블로그 관리 안 한지 오래됨 / 백준 dohoon

0개의 댓글