微軟2016校招筆試 第二場部分題目個人思路

2021-07-02 01:34:41 字數 2581 閱讀 4928

a. lucky substrings

這道題並不難,由於字串長度只有100,那麼它的子串肯定不超過1w個,列舉出所有字串都是沒有問題的,至於檢驗乙個子串裡面不同的字母數量是不是斐波那契數,我們只需要事先把斐波那契數列小於26的項都生成出來(最多每個字母都出現一遍,就是26嘛),然後列舉乙個子串之後,統計出不同字母的數量(邊找邊統計,如果當前字母之前出現過就不加,如果沒出現過就記住並+1),去這個裡面找就行了。斐波那契數列推不了幾項就到26了……

最後要字典序從小到大排列,並且還要去重,那就用string然後直接sort+unique一發,搞定

#include

#include

#include

#include

#include

#include

using

namespace

std;

char s[200];

string ans[20000];

int p_ans=0;

int fib[10000];

int p_fib=0;

void gener_fb()

i++;

}}bool find(int x)

return

false;

}int main()

; for(int j=i; jstring str(now);

ans[++p_ans] = str;}}

}sort(&ans[1], &ans[p_ans+1]);

p_ans = unique(&ans[1], &ans[p_ans+1]) - ans-1;

for(i=1;i<=p_ans;i++)

b. numeric keypad

這道題我還是想了一會的,我也不知道其他人是怎麼做的……

這道題可以注意到這麼幾點,首先就是輸入的數特別大,有500位,所以我們肯定是要一位一位處理,每一位都要盡量和輸入的一樣,因為如果前面有一位小了,後面再大也沒用;

關鍵問題是有的時候如果你輸的一樣的話,後面就不行了,比如樣例的131,你如果第二位輸了3,那你會發現第三位無解了。怎麼辦呢?其實很容易,這個時候我們只需要回退到上一層並嘗試乙個更小的數字即可。你會發現這樣的回退最多隻會出現一次,因為一旦回退之後,後面的你都可以無腦的填了。如果回退的那一位不是0的話,那麼你後面可以無腦填9,比如131你回退到12的時候,後面你都不用想了,肯定全填9,反正你在第二位已經比他小了;如果回退這一位是0的話就不行了,因為0到不了9,就只能後面全無腦填0了,比如876這個例子答案就是800.

建議預先處理乙個map[i][j],表示數字i能不能到數字j去,這樣會給你後面省很多事。

#include

#include

#include

#include

#include

using

namespace

std;

char input[600];

int t;

intmap[10][10];

int ans[600];

void initmap()

}for(i=1;i<=7;i+=3)

map[i][0]=1;

for(i=2;i<=8;i+=3)

map[i][0]=1;

map[0][0]=1;

return;

}bool go(int pos, int last)

else

return

true;

}else

return

true;}}

}return

false;

}void init()

int main()

c. spring outing

這題當時我的演算法wa了,然後想了半天也沒想出來哪兒錯,後來今天討論才知道的……

這道題目的關鍵就在於「已經知道的肯定可以去的地方」,一開始大家都知道「我至少可以待在家裡」。

那麼考慮這麼乙個事情,對於某乙個人來說,如果前面所有的地點都被pass掉了,現在投k的話,如果k在0後面,那我肯定不投;如果k在0前面,那我肯定就要投,不然沒別的選擇我就得在家呆著了;這樣,我們根據所有人的行為就能知道k到底能不能去,如果有一半人都會投k的話,那麼k就可以去了,反之k就不能去;

同樣的道理,如果k可以去了,我們看k-1的時候,如果某個人更想去k-1,那他一定會投的,否則一定不會投的。當然如果剛才結果是k去不了,那麼現在最後乙個肯定能去的選擇就是0,就變成了k-1和0之間的選擇。

所以,我們只需要從第k號地點往前試,試完k個就知道他們會在哪個地點達到第一次(也就是我們這個演算法當中的最後一次)過半數了。

由於輸入都是0~n的排列,所以我們可以將每個數在每個人當中的位置記錄下來,這樣找起來就非常方便了。

注意,並不是說乙個人絕對不會投乙個已知可取的地方的後面的票的,比如乙個人的志願是0 1 2,那麼根據剛才的結論,如果2已經可以去了,他還是會投1的,要不然就鐵定去2了。並不是說乙個人想在家呆著就一定會一直憋著。

本題由於還沒有開放,所以就不貼**了。

2016多校聯合第二場

1002 樹上每個點都有乙個點權w w 2 16 點數n 2 16 已知dp方程 dp i max 將w分成前8位和後8位,設w i 前8位和後8位為x和y,w j 前8位和後8位為a和b,如圖所示 前8位 後8位 w i x y w j a b 方程形式變為 dp i max 維護ds a y m...

2019暑假多校訓練第二場 部分題解

這次沒有爆零 有點感動 題目大意 有乙個數x 在範圍0 2 n 1 內 詢問 乙個數 y 給出答案 x y y 可以詢問多次 詢問之後 一起給出回答 可以簡單證明得到 範圍是 0 2 n 1時 需要n個數得到最小的方案數 因為兩個方案的詢問次序不同可算作兩種方案 所以 答案是 n ps 當n 100...

百度之星2015初賽第二場 部分

1002 聯接的管道 用最小長度的管子聯接所有田地,也就是求最小生成樹。然後就沒啥難度了 1003 棋盤占領 暴力題,考慮到每更新乙個點就從頭開始繼續更新可能超時,我寫的時候從每次更新的點開始跑一邊bfs.由於占領條件的特殊性,判斷 可以自己寫幾個case分類討論下 1005 序列變換 dp。最壞情...