【ABC169에 참가해 보았다】재택 근무가 되었기 때문에 매니지먼트계 SE가 경기 프로그래밍 시작해 보았다. #8 -해설도-

이번 기사



ABC169에 참가했습니다.
이번에는 드디어 A 문제까지밖에 풀리지 않는다. .
해설이나 다른 분의 소스, Twitter에서 B문제와 C문제에 대해서도 이해할 수 있었으므로
이번은 C문제까지 해설도 함께 기재합니다.

◆ 내 Atcoder 계정
htps : // 아 t 여기 r. jp / 우세 rs / 마코토 m?ぁ g = 그럼
◆ Twitter 계정
htps : // 라고 해서 r. 코 m / 마코토 _ M_ 코 r

그 전에



마침내 AtCoder 사장의 Chokudai 씨에게 Twitter 팔로우 받았습니다 (웃음)
또 그 밖에도 공부하면서 다양한 사람에게 팔로우해 주었습니다. 감사합니다.

당일의 해답 결과



서두에도 기재했습니다만, 이번은 A문제 밖에 풀 수 없었습니다.
B문제와 C문제는 조심하는 점은 깨달았지만,
실제 코드에서 무엇이 문제인지 모르고,


실적 정보



구누누,,,


되돌아와 반성



1. 프로그래밍 시간을 확보할 수 없었다

외출 자숙도 완화되고 있는 상황인 것인가
일이 갑자기 바빠서 전처럼 공부하는 시간을 잡을 수 없었습니다. .
그렇다고는 해도 공부하고 있으면 이번에 풀 수 있었는가라고 하면 다른 문제일까. .

2. 심판 시스템의 표시 변경

이것은 정말로 곤란했다. . .
이미 돌아왔습니다만, 통상이라고 어느 샘플이 AC(정답), WA(부정해)를 알 수 있습니다만,
이번 콘테스트 중에는 전부 맞추어 AC(정답), WA(부정해)라고 밖에 표시되지 않았습니다.
특히 B도 C문제도 샘플이 하나 NG였을 뿐이었음에도 불구하고,
생각이 다르냐고 생각하고 전부 다시 쓰거나 했다(그리고 보다 부정해가 되는 코드가 되어 있었다) 때문에 괴로웠습니다. .

문제 해설



이번은 서두에도 기재했습니다만 C문제까지 해설합니다! !

A 문제: Multiplication 1



문제문 발췌


해설



A와 B를 입력으로 받아서 곱한 결과를 출력합니다.

problemA.cpp
#include<bits/stdc++.h>
using namespace std;
#define rep(i, n) for(int i = 0; i < (int)(n); i++)
typedef long long ll;

int main(void) {
    int A,B;
    cin >> A >> B;
    cout << A*B << endl; //A*Bを出力
    return 0;
}

B 문제: Multiplication 2



문제문 발췌


해설



이 문제가 매우 어렵다는 이야기에 해설이기도 했습니다.
입력값 $A1, A2....An$를 모두 곱합니다.
다만 입력치의 가능한 값이 $10^{18}$ 이하입니다.
그 때문에 long long int의 최대치인 $9×10^{18}$ 정도를 넘을 가능성이 있다
오버플로우 해 버리므로, 정중하게 처리할 필요가 있습니다.
곱한 결과가 $10^{18}$를 넘은 타이밍에서 -1을 출력해 주면 됩니다.

sample.cpp
A[i]<=1000000000000000000/ans
//A[i]*ans <= 1000000000000000000はA[i]*ansが
//オーバーフローしてしまうので式展開してあげる

이것들을 정리해 이하와 같이 기재했습니다.

problemB.cpp
#include<bits/stdc++.h>
using namespace std;
#define rep(i, n) for(int i = 0; i < (int)(n); i++)
typedef long long ll;

int main(void) {
    int N;
    cin >> N;
    ll A[N];

    rep(i,N){
      cin >> A[i];
      if(A[i]==0){ //0があるとどれだけ掛けても0なので0を出力しておわる
        cout << 0 << endl;
        return 0;
      }
    }
    ll ans=1;

  for(int i=0; i<N; i++){
    if(A[i]<=1000000000000000000/ans ) //A[i]*ansが10^18を超えないと
      ans *= A[i]; //A[i]の値をかける
    else{ //A[i]*ansが10^18を超えたら
      cout << -1 << endl; //-1を出力し終了する
      return 0;
    }
  }
  cout << ans << endl;
  return 0;
}


C 문제: Multiplication 3



문제문 발췌


해설



이 문제도 마찬가지로 어렵다는 이야기가 되어 있었습니다.
해설에서도 기재가 있었습니다만, double형으로 취급하는 데이터의 사이즈를 넘는 상태가 되기 때문에
그냥 곱하는 것만으로는 오버플로가 되어 버립니다.
이 문제에 대해서는 콘테스트 종료 후 매우 알기 쉬운 페이지가 있었으므로 그쪽을 참조하십시오.
(이런 높은 품질을 바로 낼 수 있다니 굉장하다.)
◆◆ 켄쵸의 경쟁 프로 정진 기록 ◆◆

나는 문자열로받는 방식으로 콘테스트가 끝난 후 AC했습니다.

problemC.cpp

#include<bits/stdc++.h>
using namespace std;
#define rep(i, n) for(int i = 0; i < (int)(n); i++)
typedef long long ll;

int main(void) {
    ll A;
    string B;
    cin >> A >> B;

    ll i,d,dd;

    i = B[0] - '0';
    d = B[2] - '0';
    dd = B[3] - '0';

    ll ans;
    ans = (A*(i*100+d*10+dd))/100;

    cout <<ans << endl;

    return 0;
}


미래를 향해



음 꽤 힘들다. . .
그러고 보니 나선책을 사 보았습니다!
이쪽도 공부하고 공유할 수 있을 것 같은 내용이 있으면 기사로 하고 싶습니다.

마지막으로



어땠습니까?
봐도 모르겠다고 좀 더 이렇게 하면 좋지 않을까? 같은 따뜻한 말 두시도시 기다리고 있습니다.
또 Twitter도 부디 부담없이 팔로우해 주세요.
htps : // 라고 해서 r. 코 m / 마코토_M_코데 r

좋은 웹페이지 즐겨찾기