[白俊]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
を選択します.
  • a = c && b < d
  • a < c && b < d
  • 上記の場合のみ可能であるため、終了時間から次の最初の時間までの差をソート順に求めてmaxを求めることができる.
    #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);
    }