카테고리 없음

백준 18866번 젊은 날의 생이여(C++,누적합)🆘

그린푸딩 2026. 3. 28. 17:09
728x90
반응형

초기값을 무조건 반영하면 안되는것에 주의

break 주의 

#include <iostream>
#include <vector>
#include <algorithm>
#include<queue>
#include<map>
using namespace std;



int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
   
    //행복도 가장 작은거 
    //피로도 가장 큰거
    long long mins = 1e9;
    long long maxs = 0;
    int n;
    cin >> n;
    long long a, b;
    int cnt = 0;
    vector<int>happymin;
    vector<int>happymax; 
    vector<int>tiredmin;
    vector<int>tiredmax;
    happymin.assign(n + 1,1e9);
    happymax.assign(n + 1, 0);
    tiredmin.assign(n + 1, 1e9);
    tiredmax.assign(n + 1, 0);

    vector<int>happy; vector<int>tired;
    for (int i = 0; i < n; i++) {
        cin >> a >> b;     
        happy.push_back(a);
        tired.push_back(b);
    }
    //누적을 만들기 
    for (int i = 0; i < n; i++) {
        if (i == 0) {
            if(happy[i]>0)happymin[i] = happy[i];
            if(tired[i]>0)tiredmax[i] = tired[i];
            continue;
        }
        //0일때??
        if (happy[i] == 0)happymin[i] = happymin[i - 1];
        else happymin[i] = min(happymin[i - 1], happy[i]);
        if (tired[i] == 0)tiredmax[i] = tiredmax[i - 1];
        else tiredmax[i] = max(tiredmax[i - 1], tired[i]);
        //앞에서부터 happymin 
        
        //앞에서 부터 tiredmax 
        
    }

    //뒤에서 부터 누적 
    for (int i = n - 1; i >= 0; i--) {
        if (i == n - 1) {
            if (happy[i] > 0)happymax[i] = happy[i];
            if (tired[i] > 0)tiredmin[i] = tired[i];
            continue;
        }
        if (happy[i] == 0)happymax[i] = happymax[i + 1];
        else happymax[i] = max(happymax[i + 1], happy[i]);
        if (tired[i] == 0)tiredmin[i] = tiredmin[i + 1];
        else tiredmin[i] = min(tiredmin[i + 1], tired[i]);
    }

    //하나씩 채워넣기 
    int ans = 0;
    for (int i = 0; i < n-1; i++) {
        
        // 0 
        
        if (happymin[i] == 1e9 && happymax[i + 1] == 0) {
            if (tiredmax[i] < tiredmin[i + 1] ) {
                ans = i + 1;
               // cout << "여기옴1";
                continue;
            }
            else if (tiredmax[i] == 0 && tiredmin[i + 1] == 1e9) {
                ans = i + 1;
               // cout << "여기옴1_1";
                continue;
            }
        }      


        if (happymin[i] > happymax[i + 1] && tiredmax[i] < tiredmin[i + 1]) {
                ans = i + 1;//일단 여기까진 됨
                //cout << "여기옴2";
        }
        else {
            //cout << "여기옴3";
                //꺠짐
          //  break;   ??????
        
        }
    }
    if (ans == 0)cout << -1;
    else cout << ans;
    
}

 

728x90
반응형