這個題如果從直接的想法做很簡單,但是時間肯定過不去,難處理的在於如何把用完了的數字重新利用
這個題解是dls的**,大體思路是用pre[i]記錄i所在的區間的左端點,然後設定乙個標記用來記錄已經處理完的位置(不是填完數字的位置,是既填完了數字又將可利用的數字處理完了的位置),當標記小於pre[i]時表明:從標記到新的區間左端這個區間的數字可以重新利用了,然後用set**一下。這樣就解決了這個問題。
#include #include #include #include #include #include #include #include using namespace std;
const int maxn=100000;
int t,n,m,l,r;
int ans[maxn+5],pre[maxn+5];
setst;
int main()
for(int i=n-1;i>=1;i--) pre[i]=min(pre[i],pre[i+1]);//從後面開始將記錄的左端點展開
//最終使得pre陣列記錄的是到達點i的區間是從哪個端點開始的,即i所在的區間的左端點是pre[i]
int p1=1;//記錄可利用的數字的區間的左端點
for(int i=1;i<=n;i++) st.insert(i);
for(int i=1;i<=n;i++)
ans[i]=*st.begin();
st.erase(ans[i]);
}for(int i=1;i<=n;i++)
printf("%d%c",ans[i]," \n"[i==n]);//大佬的操作,學到了就膜一蛤orz
}return 0;
}
HDU 6301 (貪心 優先佇列)
題目大意 求乙個長度為n的數列,給出m個區間,這m個區間各自區間內的數不同 題解 用優先佇列來模擬過程 解題思路是想到了 可是不知道如何實現 果然還須繼續努力呀 這道題思路是去掉重複的區間 取最大的區間,用sort 結構體加幾個判斷條件來實現 用優先佇列維護1 n 中沒有出現的數 比如給你乙個10 ...
貪心 公式推導 思路
submit page time limit 1 sec memory limit 128 mb submitted 11 solved 8 zj開公司,年年榮登315晚會。315當天,一大幫員工來zj公司討工資。顯然又欠工資了囧 員工們圍成乙個圈,把zj圍在中間,打算用暴力手段討取工資。機智如zj...
(貪心)區間問題大致思路
a.描述 數軸上有n個開區間 ai,bi 選擇盡量多個區間,使得這些區間兩兩 沒有公共點。b.思路總結 1.區間x完全包含y,選y 2.按照bi從小到大排序,從第乙個區間開始選 3.把所有和上乙個區間相交的區間排除在外 c.思路分析 首先明確乙個問題 假設有兩個區間x,y,區間x完全包含y。那麼,選...