[白俊]2594:遊園地
https://www.acmicpc.net/problem/2594
Github Solution Link
前、後それぞれ10分ずつを入力して保存します.
それらを開始時間が小さい順に並べ、終了時間~その後の1時間目の差を求め、最大値を求める.
これらの論理は正常に使用するには条件が必要です.
1つのアトラクションの運行時間に含まれる他の機関は存在しないはずです.
つまり、1000~1300を運行するアトラクションがあれば、1100~1200を運行するアトラクションがあり、
ソート時に後者が後になるので、事実上最大可能な値は1310から2200ですが、1210から2200の値が最大値より大きいので正解ではない値が出ます.
これらの条件が満たされている場合は、次のようになります.
a ~ b
c ~ d
を選択します. 上記の場合のみ可能であるため、終了時間から次の最初の時間までの差をソート順に求めてmaxを求めることができる.
Github Solution Link
前、後それぞれ10分ずつを入力して保存します.
それらを開始時間が小さい順に並べ、終了時間~その後の1時間目の差を求め、最大値を求める.
これらの論理は正常に使用するには条件が必要です.
1つのアトラクションの運行時間に含まれる他の機関は存在しないはずです.
つまり、1000~1300を運行するアトラクションがあれば、1100~1200を運行するアトラクションがあり、
ソート時に後者が後になるので、事実上最大可能な値は1310から2200ですが、1210から2200の値が最大値より大きいので正解ではない値が出ます.
これらの条件が満たされている場合は、次のようになります.
a ~ b
c ~ d
を選択します.
a = c && b < d
a < c && b < d
#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
using namespace std;
vector<pair<int, int>> times;
void fastio(void);
void push(int start, int end);
int diff(int start, int end);
int main(void)
{
int num, max = 0;
int begin = 1000, fin = 2200;
int start, end;
fastio();
cin >> num;
for (int i = 0; i < num; i++)
{
cin >> start >> end;
push(start, end);
for (int j = 0; j < times.size() - 1; j++)
{
if ((diff(times[j].first, times.back().first) && diff(times.back().second, times[j].second)) \
|| (diff(times.back().first, times[j].first) && diff(times[j].second, times.back().second)))
{
times.pop_back();
break;
}
}
}
sort(times.begin(), times.end());
max = diff(begin, times[0].first);
if (max < diff(times.back().second, fin))
max = diff(times.back().second, fin);
for (int i = 0; i < times.size() - 1; i++)
if (max < diff(times[i].second, times[i + 1].first))
max = diff(times[i].second, times[i + 1].first);
cout << max << "\n";
return (0);
}
void push(int start, int end)
{
int s_time = start / 100;
int s_min = start % 100;
int e_time = end / 100;
int e_min = end % 100;
int diff = 0;
s_min -= 10;
if (s_min < 0)
{
s_min += 60;
s_time--;
}
e_min += 10;
if (e_min >= 60)
{
e_min -= 60;
e_time++;
}
times.push_back({ s_time * 100 + s_min, e_time * 100 + e_min });
}
int diff(int start, int end)
{
int s_time = start / 100;
int s_min = start % 100;
int e_time = end / 100;
int e_min = end % 100;
int diff = 0;
if (s_time <= e_time)
{
diff += (e_time - s_time) * 60;
diff += e_min - s_min;
}
return (diff >= 0 ? diff : 0);
}
void fastio(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
Reference
この問題について([白俊]2594:遊園地), 我々は、より多くの情報をここで見つけました https://velog.io/@besyia0k0/백준-2594テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol