結果

問題 No.81 すべて足すだけの簡単なお仕事です。
ユーザー motxxmotxx
提出日時 2014-11-28 01:21:45
言語 C++11
(gcc 11.4.0)
結果
WA  
実行時間 -
コード長 2,734 bytes
コンパイル時間 2,120 ms
コンパイル使用メモリ 166,228 KB
実行使用メモリ 4,384 KB
最終ジャッジ日時 2023-09-01 22:36:58
合計ジャッジ時間 3,523 ms
ジャッジサーバーID
(参考情報)
judge14 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,380 KB
testcase_01 AC 2 ms
4,384 KB
testcase_02 AC 1 ms
4,384 KB
testcase_03 WA -
testcase_04 AC 2 ms
4,380 KB
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 AC 2 ms
4,380 KB
testcase_11 WA -
testcase_12 WA -
testcase_13 AC 2 ms
4,380 KB
testcase_14 AC 1 ms
4,376 KB
testcase_15 AC 2 ms
4,376 KB
testcase_16 AC 2 ms
4,380 KB
testcase_17 AC 1 ms
4,376 KB
testcase_18 WA -
testcase_19 AC 2 ms
4,380 KB
testcase_20 WA -
testcase_21 AC 1 ms
4,376 KB
testcase_22 AC 2 ms
4,380 KB
testcase_23 WA -
testcase_24 WA -
testcase_25 AC 2 ms
4,384 KB
testcase_26 AC 1 ms
4,376 KB
testcase_27 AC 2 ms
4,380 KB
testcase_28 AC 2 ms
4,380 KB
testcase_29 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

using namespace std;

#define REP(i,a,b) for(int i=a;i<(int)b;i++)
#define rep(i,n) REP(i,0,n)

typedef long long ull;

void add(deque<int> &S, deque<int> A) {
  
  int mx = max(S.size(), A.size()) + 3;
  REP(i, S.size(), mx) S.push_front(0);
  REP(i, A.size(), mx) A.push_front(0);
  
  reverse(S.begin(), S.end());
  reverse(A.begin(), A.end());
  
  vector<int> ret;
  int kuri = 0;
  rep(i, S.size()) {
    int now = kuri + S[i] + A[i];
    if(now > 9) {
      kuri = now / 10;
      now -= 10;
      ret.push_back(now);
    }
    else {
      kuri = 0;
      ret.push_back(now);
    }
  }
  while(kuri > 0) {
    ret.push_back(kuri);
    kuri /= 10;
  }
  
  reverse(ret.begin(), ret.end());
  
  deque<int> RET;
  bool ok = 0;
  rep(i, ret.size()) {
    if(ret[i] != 0) { ok = 1; }
    if(ok) {
      RET.push_back(ret[i]);
    }
  }
  
  S = RET;
}

// true: minus
bool sub(deque<int>& S, deque<int> A) {
  
  int mx = max(S.size(), A.size()) + 3;
  REP(i, S.size(), mx) S.push_front(0);
  REP(i, A.size(), mx) A.push_front(0);
  
  bool isABigger = 0;
  rep(i, S.size()) {
    if(S[i] > A[i]) {
      isABigger = 0; break;
    }
    else if(S[i] < A[i]) {
      isABigger = 1; break;
    }
  }
  
  if(isABigger) { swap(S, A); }
  
  reverse(S.begin(), S.end());
  reverse(A.begin(), A.end());
  
  vector<int> ret;
  int kuri = 0;
  rep(i, S.size()) {
    int now = S[i]-A[i]-kuri;
    if(now < 0) {
      kuri = 0;
      while(now < 0) now += 10, kuri ++;
      ret.push_back(now);
    }
    else {
      kuri = 0;
      ret.push_back(now);
    }
  }
  
  reverse(ret.begin(), ret.end());
  
  deque<int> RET;
  bool ok = 0;
  rep(i, ret.size()) {
    if(ret[i] != 0) { ok = 1; }
    if(ok) {
      RET.push_back(ret[i]);
    }
  }
  
  S = RET;
  return isABigger;
}

int main() {
  
  int N; cin >> N;
  
  bool inverse = 0;
  deque<int> sum;
  rep(i, N) {
    long double d; cin >> d;
    long long D = (long long)(d*(1e10));
    string s; stringstream ss; ss << D; ss >> s;
    bool mcheck = 0;
    if(s[0] == '-') { mcheck = 1; s = s.substr(1); }
    int const SZ = s.size();
    deque<int> a;
    rep(i, SZ) { a.push_back(s[i]-'0'); }
    
    mcheck ^= inverse;
    
    if(mcheck) {
      int r = sub(sum, a);
      inverse ^= r;
    }
    else {
      add(sum, a);
    }
  }
  
  int sz = sum.size();
  bool zero = 1;
  if(inverse) cout << '-';
  rep(i, sz-10) {
    zero = 0;
    cout << char('0'+sum[i]);
  }
  if(zero) cout << 0;
  cout << char('.');
  REP(i, sz-10, sz) {
    cout << char('0'+sum[i]);
  }
  cout << endl;
  
  return 0;
}
0