對資料結構和演算法感興趣的可以關注一下分享演算法題的解題思路和**~
小q想要給他的朋友傳送乙個神秘字串,但是他發現字串的過於長了,於是小q發明了一種壓縮演算法對字串中重複的部分進行了壓縮,對於字串中連續的m個相同字串s將會壓縮為m|s,例如字串abcabcabc將會被壓縮為[3|abc],現在小q的同學收到了小q傳送過來的字串,你能幫助他進行解壓縮麼?
輸入描述:
輸入第一行包含乙個字串s,代表壓縮後的字串。
s的長度<=1000;
s僅包含大寫字母、[、]、|;
解壓後的字串長度不超過100000;
壓縮遞迴層數不超過10層;
輸出描述:
輸出乙個字串,代表解壓後的字串。
示例1輸入
hg[3|b[2|ca]]f
輸出hgbcacabcacabcacaf
說明hg[3|b[2|ca]]f−>hg[3|bcaca]f−>hgbcacabcacabcacaf
棧模擬。
#includeusing namespace std;
int main()
stackst;
for(int i=1;i<=n;i++)
st.push(a[i]);
}while(!st.empty()) st.pop();
for(int i=n;i>=1;i--)
st.push(a[i]);
}for(int i=1;i<=n;i++)
puts("");
return 0;
}
作為程式設計師的小q,他的數列和其他人的不太一樣,他有2n2^n2n個數。
老闆問了小q一共 m次,每次給出乙個整數qi(1<=i<=m)q_i (1 <= i <= m)qi(1<=i<=m), 要求小q把這些數每2qi2^2qi分為一組,然後把每組進行翻轉,小q想知道每次操作後整個序列中的逆序對個數是多少呢?
例如:對於序列1 3 4 2,逆序對有(4, 2),(3, 2),總數量為2。
翻轉之後為2 4 3 1,逆序對有(2, 1),(4, 3), (4, 1), (3, 1),總數量為4。
輸入描述:
第一行乙個數n(0≤n≤20)n(0 \leq n \leq 20)n(0≤n≤20)
第二行2n2^n2n個數,表示初始的序列(1≤初始序列≤1091 \leq 初始序列 \leq 10^91≤初始序列≤109)
第三行乙個數m(1≤m≤106)m(1 \leq m \leq 10^6)m(1≤m≤106)
第四行m個數表示qi(0≤qi≤n)q_i(0 \leq q_i \leq n)qi(0≤qi≤n)
輸出描述:
m行每行乙個數表示答案。
示例1輸入
22 1 4 3
41 2 0 2輸出0
660說明
初始序列2 1 4 3
2q1=22^ = 22q1=2 ->
第一次:1 2 3 4 -> 逆序對數為0
2q2=42^ = 42q2=4 ->
第二次:4 3 2 1 -> 逆序對數為6
2q3=12^ = 12q3=1 ->
第三次:4 3 2 1 -> 逆序對數為6
2q4=42^ = 42q4=4 ->
第四次:1 2 3 4 -> 逆序對數為0
咕咕咕由於業績優秀,公司給小q放了 n 天的假,身為工作狂的小q打算在在假期中工作、鍛鍊或者休息。他有個奇怪的習慣:不會連續兩天工作或鍛鍊。只有當公司營業時,小q才能去工作,只有當健身房營業時,小q才能去健身,小q一天只能幹一件事。給出假期中公司,健身房的營業情況,求小q最少需要休息幾天。
輸入描述:
第一行乙個整數 n(1≤n≤100000)n(1\leq n\leq 100000)n(1≤n≤100000) 表示放假天數
第二行 n 個數 每個數為0或1,第 i 個數表示公司在第 i 天是否營業
第三行 n 個數 每個數為0或1,第 i 個數表示健身房在第 i 天是否營業
(1為營業 0為不營業)
輸出描述:
乙個整數,表示小q休息的最少天數
示例1輸入
41 1 0 0
0 1 1 0
輸出說明
小q可以在第一天工作,第二天或第三天健身,小q最少休息2天
dp(i,0)表示在到第i天工作所能休息的最少天數,dp(i,1)表示在到第i天健身所能休息的最少天數,dp(i,2)表示在到第i天休息所能休息的最少天數。
那麼如果第i天能工作,肯定是從第i-1天不工作轉移過來
如果第i天能健身,肯定是從第i-1天不健身轉移過來
第i天休息,則是從第i-1天三種狀態轉移過來,因為沒有要求不能連續休息兩天。
#includeusing namespace std;
const int n=1e5+5;
int a[n],b[n],dp[n][3];
int main()
for(int i=1;i<=n;i++)
memset(dp,0x3f3f3f3f,sizeof(dp));
if(a[1])
if(b[1])
dp[1][2]=1;
for(int i=2;i<=n;i++)
if(b[i])
dp[i][2]=min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]))+1;
}printf("%d\n",min(dp[n][0],min(dp[n][1],dp[n][2])));
return 0;
}
小q在進行一場競技遊戲,這場遊戲的勝負關鍵就在於能否能爭奪一條長度為l的河道,即可以看作是[0,l]的一條數軸。
這款競技遊戲當中有n個可以提供視野的道具−真視守衛,第i個真視守衛能夠覆蓋區間[xi,yi]。現在小q想知道至少用幾個真視守衛就可以覆蓋整段河道。
輸入描述:
輸入包括n+1行。
第一行包括兩個正整數n和l(1<=n<=105,1<=l<=109)
接下來的n行,每行兩個正整數xi,yi(0<=xi<=yi<=109),表示第i個真視守衛覆蓋的區間。
輸出描述:
乙個整數,表示最少需要的真視守衛數量, 如果無解, 輸出-1。
示例1輸入
4 63 6
2 40 2
4 7輸出
按左端點從小到大,右端點從大到小排序,每次看乙個區間能裡的點往右最大能延伸到哪(mx),下次更新上限(up)的時候就用這個mx。這個過程和leetcode跳躍遊戲那題很像。
#includeusing namespace std;
struct node
return l0)
for(int i=1;i=l)
}else
}if(mxprintf("%d\n",cnt);
return 0;
}
騰訊2020校園招聘 後台
小q在週末的時候和他的小夥伴來到大城市逛街,一條步行街上有很多高樓,共有n座高樓排成一行。小q從第一棟一直走到了最後一棟,小q從來都沒有見到這麼多的樓,所以他想知道他在每棟樓的位置處能看到多少棟樓呢?當前面的樓的高度大於等於後面的樓時,後面的樓將被擋住 輸入描述 輸入第一行將包含乙個數字n,代表樓的...
騰訊2020校園招聘 後台(3)
乙個簡單的動態規劃,注釋寫的很明白了 var n parseint readline var p1 newarray n var p2 newarray n var line readline var lines line.split for let i 0 i n i line readline ...
騰訊2020校園招聘 後台 程式設計題
a 壓縮演算法 做法 遞迴處理每個匹配的 中的單詞,再拼接起來。b 逛街 做法 假設現在在i樓,一定可以看到i 1和i 1的樓,i 往左看是形成的序列是乙個單調增的序列,用單調棧可以求出離當前樓最近,而且高度還要高於當前樓的樓。c 逆序對 做法 把序列的歸併樹畫出來,每一層是由許多段構成的。而每一層...