티스토리 뷰

 

그리디로 풀 수있는 문제다

내가 움직일 수 있는 거리는 (손님 방문시간 - 현재시간)만큼이다

 

그럼 우린 시간순으로 정렬을하고 내가 움직일 수 있는 범위를 가지고 다니면서

만약 그 범위안에 손님이 만족하는 온도가 없다면 NO 가능하다면 YES를 출력해 줄 수 있따!

 

그리고 만족한다면 시간을 바꿔주고 왼쪽 오른쪽 범위는

각각 포함할 수 있는 최대, 최소의 거리로 해줘야한다

처음에는 만족하는 범위를 찾으려고 하다가 거꾸로 해야 쉽겠다 싶어서 주석처리하고

반대의 경우를 찾았다!

 

앞으로도 쉬운것좀 생각하자.. 어려운 방법말고..!!

 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll q,n,m;
 
 
int main(){
   scanf(" %lld",&q);
   while(q--){
      scanf(" %lld %lld",&n,&m);
      priority_queue<pair<ll,pair<ll,ll>>> pq;
      for(ll i=0;i<n;i++){
         ll t,l,h; scanf(" %lld %lld %lld",&t,&l,&h);
         pq.push({-t,{l,h}});
      }
      ll nowTime=0,nowTemp=m,nowLeft=m,nowRight=m;
      bool answer=true;
      while(!pq.empty()){
         ll visitedTime = -pq.top().first;
         ll left = pq.top().second.first;
         ll right = pq.top().second.second;
         pq.pop();
 
         ll timeDiff = visitedTime-nowTime;
         ll tempLeft= nowLeft-timeDiff;
         ll tempRight = nowRight+timeDiff;
 
         if(tempRight<left || right <tempLeft) {
            answer= falsebreak;
         }else{
            nowTime = visitedTime;
            nowLeft = max(tempLeft,left);
            nowRight = min(tempRight,right);
         }
      }
      if(answer) puts("YES");
      else puts("NO");
   }
}
 
 

'알고리즘 > Codeforces' 카테고리의 다른 글

R620(Div.2) D. Shortest and Longest LIS  (0) 2020.02.18
Edu82(Div.2) D. Fill The Bag  (0) 2020.02.16
R620(Div.2) B.Longest Palindrome  (0) 2020.02.16
R619(Div.2) B. Motarack's Birthday  (0) 2020.02.16
Edu82(Div.2) C. Perfect Keyboard  (0) 2020.02.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함