日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

南海云课堂春季11(T)K1 拓展:单调队列

發(fā)布時(shí)間:2023/12/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 南海云课堂春季11(T)K1 拓展:单调队列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問題A 幸運(yùn)數(shù)

Description

我們將一個(gè)正整數(shù)分解成若干個(gè)質(zhì)因數(shù)(質(zhì)數(shù)因子)的乘積,若得到的質(zhì)因數(shù)的個(gè)數(shù)也為質(zhì)數(shù),則稱這個(gè)整數(shù)為幸運(yùn)數(shù)。例如 12 = 2 × 2 × 3,它有 3 個(gè)質(zhì)因數(shù),分別是 2、2、3,而 3 也是質(zhì)數(shù),所以 12 是一個(gè)幸運(yùn)數(shù);210 不是一個(gè)幸運(yùn)數(shù),因?yàn)?210 = 2 × 3 × 5 × 7,它有 4 個(gè)質(zhì)因數(shù),分別是 2、3、5、7,而 4 不是質(zhì)數(shù)。

現(xiàn)在,請(qǐng)你編程求:不大于 n 的所有幸運(yùn)數(shù)。

Format

Input

輸入一行一個(gè)整數(shù) n。

Output

若干行,每行一個(gè)幸運(yùn)數(shù)。要求按照從小到大的順序輸出。

Samples

Sample Input 1

12

Sample Output 1

4 6 8 9 10 12

Limitation

對(duì)于 50% 的數(shù)據(jù),n ≤ 1000;

對(duì)于 80% 的數(shù)據(jù),n ≤ 10000;

對(duì)于 100% 的數(shù)據(jù),2 ≤ n ≤ 100000。

#include<bits/stdc++.h> using namespace std; const int maxx=1e5+15; long long n,a[100005],b; int main() {a[0]=1;a[1]=1;for(register int i=2;i<=sqrt(maxx);++i){for(register int j=i+i;j<=maxx;j+=i){a[j]=1;}}cin>>n;for(register int i=4;i<=n;++i){if(a[i]==1){int num=i,num2=0;for(int j=2;num!=1;){if(num%j==0) num/=j,num2++;else{while(num%j!=0) j++;}}if(a[num2]==0) cout<<i<<endl;}}return 0; }

問題B?字符串展開

Description

對(duì)于一個(gè)字符串,如果其中含有類似于“d - h”或者“4 - 8”的字符子串,我們就把它當(dāng)作一種簡(jiǎn)寫。還原輸出此字符串時(shí),用連續(xù)遞增的字母或數(shù)字串替代其中的減號(hào)。上面兩個(gè)子串分別輸出為“defgh” 和 “45678”。具體約定如下:

(1)遇到下面的情況需要對(duì)字符串進(jìn)行展開:在輸入的字符串中,出現(xiàn)了減號(hào) “-”,減號(hào)兩側(cè)同為小寫字母或同為數(shù)字,且按照 ASCII 碼的順序,減號(hào)右邊的字符嚴(yán)格大于左邊的字符。

(2)如果減號(hào)右邊的字符恰好是左邊字符的后繼,只刪除中間的減號(hào),例如:“d - e” 應(yīng)輸出為 “de”,“3 - 4”應(yīng)輸出為 “34”。如果減號(hào)右邊的字符按照 ASCII碼的順序小于或等于左邊字符,輸出時(shí),要保留中間的減號(hào),例如:“d - d” 應(yīng)輸出為 “d - d”,“3 - 1” 應(yīng)輸出為“3 - 1”。

現(xiàn)在,輸入一個(gè)字符串,請(qǐng)將此字符串展開輸出。

Format

Input

輸入一行一個(gè)字符串,長(zhǎng)度不超過 200,僅由數(shù)字、小寫字母和減號(hào) “-” 組成。行首和行末均無多余空格。

Output

輸出一行一個(gè)字符串,為展開后的字符串。

Samples

Sample Input 1

abcs-w-y1234-9s-4zz

Sample Output 1

abcstuvwxy123456789s-4zz

?

#include<bits/stdc++.h> using namespace std; string s; int main() {cin>>s;for(int i=0;i<s.size();i++){if(s[i]!='-'){cout<<s[i];}if(s[i]=='-'){if(s[i-1]>='a'&&s[i-1]<='z'&&s[i+1]>='a'&&s[i+1]<='z'&&int(s[i-1])<int(s[i+1])){for(int j=int(s[i-1])+1;j<int(s[i+1]);j++){cout<<char(j);}}else if(s[i-1]>='A'&&s[i-1]<='Z'&&s[i+1]>='A'&&s[i+1]<='Z'&&int(s[i-1])<int(s[i+1])){for(int j=int(s[i-1])+1;j<int(s[i+1]);j++){cout<<char(j);}}else if(s[i-1]>='0'&&s[i-1]<='9'&&s[i+1]>='0'&&s[i+1]<='9'&&int(s[i-1])<int(s[i+1])){for(int j=int(s[i-1])+1;j<int(s[i+1]);j++){cout<<char(j);}}else cout<<"-";}}return 0; }

問題C?懶羊羊吃草

Description

眾所周知,懶羊羊是所有小羊里最貪吃的一只。然而,鮮為人知的是,懶羊羊也有存儲(chǔ)糧食的習(xí)慣。而更讓大家吃驚的事實(shí)是,我們的懶羊羊做事很有條理,每當(dāng)他存儲(chǔ)一份糧食時(shí),他會(huì)專門拿出一個(gè)筐來存放。因此,他的倉庫里有很多很多筐的青草。而我們的懶羊羊又是一個(gè)經(jīng)常饞嘴的小羊,每當(dāng)他想吃草時(shí),就會(huì)從倉庫里找出數(shù)量最少的一筐草,把它吃掉。可是懶羊羊因?yàn)椴莩缘锰嗔藢?dǎo)致大腦運(yùn)轉(zhuǎn)緩慢,所以他不得不向你請(qǐng)求支援,幫他找出他應(yīng)該吃數(shù)量為多少的青草。

Format

Input

第 1 行有 1 個(gè)正整數(shù) n,表示懶羊羊一共進(jìn)行了 n 次操作。

第 2 行至第 n+1 行,每行表示一個(gè)懶羊羊的操作:當(dāng)這行形式為單獨(dú)一個(gè)字符 “q” 時(shí),表示懶羊羊肚子餓了,要吃掉倉庫里當(dāng)前數(shù)量最少的那份青草;當(dāng)這行形式為一個(gè)字符 “i” 和一個(gè)整數(shù) k 時(shí),表示懶羊羊?qū)⒁环輸?shù)量為 k 的青草存入了倉庫,“i” 和 k 之間用 1 個(gè)空格隔開。

保證每次詢問時(shí),倉庫里都有草可吃,且所有操作中懶羊羊至少會(huì)吃一次草。

Output

輸出若干行。每當(dāng)輸入為 “q” 時(shí),輸出一行一個(gè)數(shù),表示懶羊羊當(dāng)前吃掉的那份青草的數(shù)量是多少。

Samples

Sample Input 1

5 i 5 i 2 q i 9 q

Sample Output 1

2 5

Explanation

樣例一說明:

共有 5 次操作,分別為懶羊羊存入數(shù)量為 5 的青草,存入數(shù)量為 2 的青草,吃掉當(dāng)前數(shù)量最少的青草(2),存入數(shù)量為 9 的青草,吃掉當(dāng)前數(shù)量最少的青草(5)。

Limitation

對(duì)于 30% 的數(shù)據(jù),1 ≤ n ≤ 3000;

對(duì)于 60% 的數(shù)據(jù),1 ≤ n ≤ 40000;

對(duì)于 100% 的數(shù)據(jù),1 ≤ n ≤ 1000000,1 ≤ k ≤ 2147483647。

#include<bits/stdc++.h> using namespace std; int n; char c; priority_queue<int,vector<int>,greater<int> > b; int main() {scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",&c);if(c=='i'){int k;scanf("%d",&k);b.push(k);}else{printf("%d\n",b.top());b.pop();}}return 0; }

問題D 方格稿紙

Description

小 y 終于在小學(xué)學(xué)會(huì)了一些字、詞、句子,會(huì)寫一點(diǎn)作文了。某一天,小 y買了一張方格稿紙來寫作文,稿紙是 n 行 m 列的,形狀如下所示(圖中 n = m = 5):

?

某天小 y 的鄰居小小 x 來小 y 家玩,無聊地用黑墨水筆把小 y 新買的方格稿紙涂黑了很多格子。每個(gè)格子不是完全黑色就是完全白色,如下圖所示。

?

小 y 不能責(zé)怪小 x。作文寫不成了,他也覺得很無聊,就開始數(shù)里面有多少“魔幻方陣”。如果稿紙中一個(gè) k × k 的正方形區(qū)域滿足以下兩個(gè)條件,那么它就是魔幻方陣:

(1)黑白格子的數(shù)量差不能超過 1;

(2)k 不能小于 2。

上圖染色后的方格稿紙共有 9 個(gè)魔幻方陣(6 個(gè) 2 × 2 的魔幻方陣,3 個(gè) 3 × 3 的魔幻方陣)。

現(xiàn)在,請(qǐng)你幫助小 y 編程計(jì)算被染色的稿紙里面有多少個(gè)魔幻方陣。

Format

Input

第一行有 2 個(gè)正整數(shù) n 和 m(之間以一個(gè)空格分隔),表示 n 行 m 列的稿紙。

接下來 n 行,每行有 m 個(gè) 0 或 1 的整數(shù)(之間以一個(gè)空格分隔),代表這一行中每一個(gè)格子的顏色。如果這個(gè)數(shù)是 1 則為黑色,是 0 則為白色。

Output

輸出一行一個(gè)整數(shù),表示稿紙中魔幻方陣的個(gè)數(shù)。

Samples

Sample Input 1

5 5 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 1

Sample Output 1

9

Limitation

對(duì)于 50% 的數(shù)據(jù),1 ≤ n ≤ 10,1 ≤ m ≤ 10;

對(duì)于 75% 的數(shù)據(jù),1 ≤ n ≤ 180,1 ≤ m ≤ 180;

對(duì)于 100% 的數(shù)據(jù),1 ≤ n ≤ 300,1 ≤ m ≤ 300。

#include<bits/stdc++.h> using namespace std; int n,m,a[305][305],b[305][305],sum=0; int main() {cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];b[i][j]=b[i-1][j]+b[i][j-1]-b[i-1][j-1]+a[i][j];}}int black=0,white=0;for(int k=2;k<=n;k++){black=0;white=0;for (int i=1;i<=n-k+1;i++){for (int j=1;j<=m-k+1;j++){int x=i+k-1;int y=j+k-1;black=b[x][y]-b[i-1][y]-b[x][j-1]+b[i-1][j-1];white=k*k-black;if(abs(black-white)<=1) sum++;}}}cout<<sum;return 0; }

問題E?二項(xiàng)式展開

Description

JSOI2017 夏令營后,小 y 就在學(xué)習(xí)林老師的《數(shù)學(xué)一本通》。在《組合數(shù)學(xué)》那一章發(fā)現(xiàn)這樣一個(gè)問題,在整式的乘法中,有:(a + b)^1(a+b)1?= a + b ,(a + b)^2(a+b)2?=?a^2a2?+ 2ab +?b^2b2,...等等,這些都可以用簡(jiǎn)單的手算求得。但是他想如果要求?(a + b)^n(a+b)n?的展開式,就不容易很快手算了。

現(xiàn)在,他需要你和他一起編程解決這個(gè)問題。

Format

Input

輸入一行一個(gè)整數(shù) n。

Output

輸出一行一個(gè)完整的表達(dá)式。

格式為:(a + b)^n(a+b)n?=??a^n?an?+??a^(n-1)?a(n?1)b +??a^(n-2)?a(n?2)b^2b2?+ ... +??b^n?bn

其中:“?” 為系數(shù),如果系數(shù)為 1,則需要省略系數(shù);如果次數(shù)為 1,則需要省略次數(shù);如果次數(shù)為 0,則需要省略;如果系數(shù)為 0,則需要省略這一項(xiàng)。

注意:前面?(a + b)^n(a+b)n?的次數(shù)是必有的,表達(dá)式的任何地方都不能有多余空格。

Samples

Sample Input 1

5

Sample Output 1

(a+b)^5=a^5+5a^4b+10a^3b^2+10a^2b^3+5ab^4+b^5

Limitation

對(duì)于 30% 的數(shù)據(jù),n ≤ 18;

對(duì)于 60% 的數(shù)據(jù),n ≤ 34;

對(duì)于 100% 的數(shù)據(jù),1 ≤ n ≤ 67。

#include<bits/stdc++.h> using namespace std; unsigned long long n,atou,btou,jia,a[70][70]; int main() {cin>>n;if(n==1){cout<<"(a+b)^1=a+b";return 0;}atou=n-1;btou=1;a[1][1]=1;a[1][2]=1;jia=2;for(int i=1;i<=n;i++){for(int j=1;j<=jia;j++){if(j==1) a[i][1]=1;else if(j==jia) a[i][jia]=1;else{a[i][j]=a[i-1][j]+a[i-1][j-1];}}jia++;}cout<<"(a+b)^"<<n<<"=";for(int i=1;i<=n+1;i++){if(i==1) cout<<"a^"<<n<<"+";else if(i==n+1) cout<<"b^"<<n;else{cout<<a[n][i]<<"a";if(atou==1) cout<<"b^"<<btou<<"+";else if(btou==1) cout<<"^"<<atou<<"b"<<"+";else cout<<"^"<<atou<<"b"<<"^"<<btou<<"+";atou--;btou++;}}return 0; } /* (a+b)^5=a^5+5a^4b+10a^3b^2+10a^2b^3+5ab^4+b^5 1 1 1 2 1 1 3 3 1 1 4 6 4 1 */

問題F 布丁

Description

Farmer John建立了一個(gè)布丁工廠。在接下來的 N(1 ≤ N ≤ 40000)個(gè)星期里,原料牛奶和勞動(dòng)力的價(jià)格會(huì)有很大波動(dòng)。Farmer John希望能夠在滿足消費(fèi)者需求的前提下盡量減小花費(fèi)。

Farmer John預(yù)計(jì)接下來每個(gè)星期會(huì)需要 Ci(1 ≤ Ci ≤ 5000)元錢來生產(chǎn)一單位布丁,且消費(fèi)者會(huì)需要 Pi(0 ≤ Pi ≤ 10000)單位布丁。

Farmer John每星期即可以生產(chǎn)布丁,也可以儲(chǔ)存布丁供以后使用。它的倉庫存儲(chǔ)一星期一單位布丁需要 S(1 ≤ S ≤ 100)元錢。但是由于布丁有保質(zhì)期,所以最多只能保存 T(0 ≤ T ≤ 40000)星期。也就是說 x 星期生產(chǎn)的布丁可以在(x + T)星期銷售,但是不能在(x + T + 1)星期銷售。

請(qǐng)幫助Farmer John安排生產(chǎn)與存儲(chǔ)的方案使得在滿足消費(fèi)者需求的前提下盡量減小花費(fèi)。

Format

Input

第一行為 N,S 與 T。

第二行到第 N + 1 行:每一行兩個(gè)數(shù),即 Ci 與 Pi。

Output

僅一個(gè)數(shù),即滿足顧客需求前提下的最小花費(fèi)。

Samples

Sample Input 1

5 10 3 12 1 21 2 27 4 45 5 52 3

Sample Output 1

488

Limitation

對(duì)于 50% 的數(shù)據(jù),滿足 1 ≤ N ≤ 5000,1 ≤ T ≤ 5000;

對(duì)于 100% 的數(shù)據(jù),見題目描述。

#include<bits/stdc++.h> using namespace std; long long n,s,tim,ans=0,a[40005],b[40005],q[40005],h=1,t=0; int main() {cin>>n>>s>>tim;for(int i=1;i<=n;i++){ cin>>a[i]>>b[i];} for(int i=1;i<=n;i++){while(h<=t&&q[h]<=i-tim) h++;while(h<=t&&a[q[t]]+s*(i-q[t])>a[i]) t--;q[++t]=i;ans+=(a[q[h]]+s*(i-q[h]))*b[i];}cout<<ans;return 0; }

問題G 滑動(dòng)窗口(單調(diào)隊(duì)列)

Description

給你一個(gè)長(zhǎng)度為N的數(shù)組,一個(gè)長(zhǎng)為K的滑動(dòng)的窗體從最左移至最右端,你只能見到窗口的K個(gè)數(shù),每次窗體向右移動(dòng)一位,如下表:

你的任務(wù)是找出窗口在各位置時(shí)的 max value 以及 min value。

Format

Input

第一行,兩個(gè)整數(shù) n 和 k;

第二行為長(zhǎng)度為 n 的數(shù)組。

Output

兩行:

第一行每個(gè)位置的 min value;

第二行每個(gè)位置的 max value。

Samples

Sample Input 1

8 3 1 3 -1 -3 5 3 6 7

Sample Output 1

-1 -3 -3 -3 3 3 3 3 5 5 6 7

Limitation

對(duì)于 20% 的數(shù)據(jù),n ≤ 500;

對(duì)于 50% 的數(shù)據(jù),n ≤ 100000;

對(duì)于 100% 的數(shù)據(jù),n ≤ 1000000。

#include<bits/stdc++.h> using namespace std; long long n,k,a[1000005]; deque<int> q,s; int main() {cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){while(!s.empty()&&s.front()<=i-k) s.pop_front();while(!s.empty()&&a[s.back()]>=a[i]) s.pop_back();s.push_back(i);if(i>=k) cout<<a[s.front()]<<" ";}cout<<endl;for(int i=1;i<=n;i++){while(!q.empty()&&q.front()<=i-k) q.pop_front();while(!q.empty()&&a[q.back()]<=a[i]) q.pop_back();q.push_back(i);if(i>=k) cout<<a[q.front()]<<" ";}return 0; }

總結(jié)

以上是生活随笔為你收集整理的南海云课堂春季11(T)K1 拓展:单调队列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。