BOJ 1161 - 버스

image.png

번역이 내용이 누락되어 있어서 그룹끼리 모두 타고 내려야 한다고 생각하고 한시간동안

아니이걸 DP를 안쓰고 어떻게 그리디로 풀지?

이난리하다가 질문 게시판에 오역이 되어있다는 글을 보고 바로 풀 수 있었다.

후 시간 개아깝네

문제는 오래된 문제답게 단순한데, 그냥 $S_i$ 로 정렬을 하고 최대, 최소값을 관리할 수 있는 multiset 같은걸로 승객이 내리는 시간을 관리한다.

$S_i$ 로 정렬되어 있으므로 현재 $S_i$ 보다 이전에 내린 승객들을 모두 빼주고,

만약 버스가 비어있으면 넣을 수 있는데까지 넣고,

비어있지 않다면 버스의 내리는 시간의 최대값이 더 줄어들 수 있을 때 까지 현재 승객들을 태운다.

void solve() {  
   int K, N, C;  
   cin >> K >> N >> C;  
   vector<array<int, 3>> a(K);  
   for (auto &[s, e, m]: a) cin >> s >> e >> m;  
   sort(all(a), [&](auto &a, auto &b) {  
      if (a[0] == b[0])return a[1] < b[1];  
      return a[0] < b[0];  
   });  
   int s, e, m, ans = 0;  
   multiset<int> ride_off;  
   for (auto cur: a) {  
      s = cur[0], e = cur[1], m = cur[2];  
      while (sz(ride_off) && *ride_off.begin() <= s)  
         ride_off.erase(ride_off.begin());  
      while (m && sz(ride_off) < C) {  
         ride_off.insert(e);  
         ans++;  
         m--;  
      }  
      while (m && sz(ride_off) && *ride_off.rbegin() > e) {  
         ride_off.erase(ride_off.find(*ride_off.rbegin()));  
         ride_off.insert(e);  
         m--;  
      }  
   }  
   cout << ans;  
}

Tags:

Categories:

Updated:

Comments