**360 筆試 登山者行走步數

360 筆試 登山者的步數

這裏寫圖片描述
分析代碼如下:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int n = 100;

typedef struct Mountains
{
    int begin;
    int end;
    int height;
    /*bool operator <(const struct Mountains& other) const
    {
        return begin < other.begin;
    }
    */
}M;
M num[n];

//對應的結構體是按照 節點的end進行排序 升序 如果是相同的end情況下,則按照節點的begin排序
bool cmp(M a,M b)
{
    if(a.end != b.end)
        return a.end < b.end;
    else
        return a.begin < b.begin;
}

int slove()
{
    int sum;
    cin >> sum;
    //輸入
    for(int i=0;i<sum;i++)
    {
        cin >> num[i].begin >> num[i].end >> num[i].height;
    }
    //排序
    sort(num,num+sum,cmp);

    int k = 0;// 標記 求解斷點 就是沒有重合山的斷點
    int flag[n];//斷點的位置
    //A 作爲起始點 也是一個斷點 即 flag[0] = 0;
    memset(flag,0,sizeof(flag));

    int minn = 0x3f3f3f3f,cnt;

    //將重合部分時 那個begin的最小值記錄 就是如果有多處重疊 選擇起始begin最小的點
    for(int i=0;i<sum;i++)
    {
        if(minn>num[i].begin)
        {
            cnt = i;
            minn = num[i].begin;
        }
    }
    //選擇斷點的位置
    for(int i=cnt;i<sum-1;i++)
    {
        //存在着縫隙 即爲斷點
        if(num[i].end < num[i+1].begin)
        {
            flag[k++] = i;
        }
    }

    //末尾節點也是斷點
    flag[k++] = sum-1;
    int maxx = 0,ans = 0;

    int offest = num[sum-1].end; // 橫座標的位移 不變

    for(int i=0;i<sum;i++)
    {
        //在斷點外面 就是有重合的部分 取最高的height即可
        maxx = max(maxx,num[i].height);
        if(i==flag[ans])
        {
            //斷點也即區間 每個區間的求解 vertical_offest
            offest += 2*maxx;
            maxx = 0;
            ans++;
        }
    }

    cout << offest << endl;
    return offest;
}
int main()
{
    slove();
    cout << "Hello world!" << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章