hiro1729
@hiro1729

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ABC001 - D 感雨時刻の整理

Q&A

Closed

D問題 感雨時刻の整理

3個のテストケースだけWAになります。どこがおかしいでしょうか。

問題と提出

問題・・・https://atcoder.jp/contests/abc001/tasks/abc001_4
提出・・・https://atcoder.jp/contests/abc001/submissions/37533483

そのプログラム

D_感雨時刻の整理.cpp
#include <iostream>
#include <string>

using namespace std;

int main() {
  int n;
  cin >> n;
  bool rain[289];
  for (int i = 0; i < 289; i++)
    rain[i] = false;
  string se;
  for (int i = 0; i < n; i++) {
    cin >> se;
    int s_h = stoi(se.substr(0, 2));
    int s_m = stoi(se.substr(2, 2));
    int e_h = stoi(se.substr(5, 2));
    int e_m = stoi(se.substr(7, 2));
    int s_m_rnd = (s_m / 5) * 5;
    int e_m_rnd = ((e_m - 1) / 5 + 1) * 5;
    int sum_s_m = s_h * 60 + s_m_rnd;
    int sum_e_m = e_h * 60 + e_m_rnd;
    for (int j = sum_s_m / 5; j < sum_e_m / 5; j++)
      rain[j] = true;
  }

  int now = false;
  for (int i = 0; i < 289; i++) {
    if (rain[i]) {
      if (!now) {
	now = true;
	int h = i / 12;
	int m = i % 12 * 5;
	if (h < 10)
	  cout << "0";
	cout << h;
	if (m < 10)
	  cout << "0";
	cout << m << "-";
      }
    } else {
      if (now) {
	now = false;
	int h = i / 12;
	int m = i % 12 * 5;
	if (h < 10)
	  cout << "0";
	cout << h;
	if (m < 10)
	  cout << "0";
	cout << m << endl;
      }
    }
    if (i == 288 && now == true)
      cout << "2400" << endl;
  }
  return 0;
}

どこが間違ってるか教えてください。
rainは雨が降ってる時間を表す配列、5分ごとです。

0

1Answer

間違っているのはここです。

    int e_m_rnd = ((e_m - 1) / 5 + 1) * 5;

e_mが0のとき、e_m_rndがいくつになるか考えてみてください。

参考 : C++における負の整数の割り算および余りについて - Qiita

なお、「Language Test 202001 - AtCoder」によると、C++はAtCoderにて-std=gnu++17もしくは-std=c++17、つまりC++17でコンパイルされます。C++17はC++11の後継なので、参考のリンク先の「(C++11から)」に相当します。

0Like

Comments

  1. @hiro1729

    Questioner

    ありがとうございます!!ACになりました
  2. ちなみに、こういう場合の定番の書き方は以下になります。

    int e_m_rnd = (e_m + 4) / 5 * 5;

Your answer might help someone💌