題目大意:
已知有一串數字,問在原來的數字串的字典序加m後,應該輸出多少
解題思路:
最簡便的做法是用next_permutation,這個生成的全排列可以按照字典序遞增,這裡我用的是搜尋的方法。首先我從後往前搜,一直記錄最大值,假如遇到比最大值小的數記為a[j],停止搜尋,當前,證明我們可以進行一次交換從而達到加一的效果,那麼要找哪個數來完成加一呢?我們再進行同樣的搜尋過程,記錄下比a[j]大的數字裡面最小的那乙個,記為a[i]。最後完成交換,最後,a[j]之前搜尋的數字要從大到小排。
廢話:哎,這種xjb搜尋錯估了複雜度,其實最後的複雜度只是o(m*n*logn),同時最後的從大到小排也沒想過。
#include #define inf 0x3f3f3f3f
using namespace std;
int main()
reverse(arrmv.begin(),arrmv.end());
for(int i=0;iarrmv[j])
reverse(arrmv.begin(),arrmv.end());
for(int i=0;i<(int)arrmv.size();i++)
cout
}
洛谷 P1088 火星人
題目描述 人類終於登上了火星的土地並且見到了神秘的火星人。人類和火星人都無法理解對方的語言,但是我們的科學家發明了一種用數字交流的方法。這種交流方法是這樣的,首先,火星人把乙個非常大的數字告訴人類科學家,科學家破解這個數字的含義後,再把乙個很小的數字加到這個大數上面,把結果告訴火星人,作為人類的回答...
洛谷 P1088 火星人
題目描述 人類終於登上了火星的土地並且見到了神秘的火星人。人類和火星人都無法理解對方的語言,但是我們的科學家發明了一種用數字交流的方法。這種交流方法是這樣的,首先,火星人把乙個非常大的數字告訴人類科學家,科學家破解這個數字的含義後,再把乙個很小的數字加到這個大數上面,把結果告訴火星人,作為人類的回答...
洛谷P1088火星人
傳送門 人類終於登上了火星的土地並且見到了神秘的火星人。人類和火星人都無法理解對方的語言,但是我們的科學家發明了一種用數字交流的方法。這種交流方法是這樣的,首先,火星人把乙個非常大的數字告訴人類科學家,科學家破解這個數字的含義後,再把乙個很小的數字加到這個大數上面,把結果告訴火星人,作為人類的回答。...