1449-空港リフト-グリディアルゴリズムの修理


質問する



質問リンク:https://www.acmicpc.net/problem/1449

ポリシー

  • テープを貼って防水します.水を塞ぐときは、少なくともその位置の左右0.5の間隔を与えなければならない.これは、穴ごとにテープの長さが1つ必要であることを意味する.
  • のテープの位置を表す変数を作成します.テープの位置が穴を覆うことができる場合、その穴は直接通過します.そうしないと、新しいテープが必要な場合や座標を移動する必要がある場合、条件が変更されます.
  • コード#コード#

    #include<cstdio>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    int N, L;
    
    int main(){
    
        // freopen("../input.txt","rt",stdin);
        
        scanf("%d %d",&N, &L);
        int tmp;
        vector<int> hole;
        for(int i=0; i<N; i++){
            scanf("%d",&tmp);
            hole.push_back(tmp);
        }
        // 홀을 크기에 따라 정렬하는 것은 중요하다.
        sort(hole.begin(), hole.end());
    	
        // tape를 가장 첫번째 위치한 hole-1의 테이프의 길이를 더해준 것으로 한다.
        // hole을 하나 채우는데 1의 길이가 필요하므로 hole[0]-1을 해준것이고, 
        //테이프를 하나 사용해야하므로 L을 더해주었다.
        int tape = hole[0]-1 + L;
        
        int cnt = 1;
        for(int i=1; i<hole.size(); i++){
        	// hole의 위치가 tape의 위치보다 크면 새로운 tape의 위치를 할당해주고 cnt++을 해준다.
            if(hole[i] > tape){
                tape = hole[i] - 1 + L;
                cnt++;
            }
        }
        printf("%d\n",cnt);
        return 0;
    }
    
    
    

    感想


    tapeという変数を作るのはいい考えだ.前面の穴から順にテープを貼れば、最小限のテープが使えるので、階調アルゴリズムです.