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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

牛客OI周赛15-普及组

發(fā)布時(shí)間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客OI周赛15-普及组 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 咪咪游戲
bool f1,f2,f;
f1用于記錄m
f2用于記錄q
f用于判斷串的好壞。1為壞,0為好
注意幾種情況:
mqm
mmq
具體看代碼:

#include<bits/stdc++.h> using namespace std; int main() {int n;cin>>n;string s;while(n--){bool f1=0;bool f2=0;bool f=0;cin>>s;char ch=getchar();for(int i=0;i<s.length();i++){if(s[i]=='m'&&f1==0){f1=1;continue;}else if(s[i]=='q'&&f2==0&&f1==1){f1=0;continue;}else {f=1;break;}}if(f||f1)cout<<"No"<<endl;//注意最后判斷時(shí),還要判斷f1,因?yàn)閒1=0才說(shuō)明mq都配對(duì)成功,沒(méi)有多余的melse cout<<"Yes"<<endl;}return 0; }

2. 三角形
dp問(wèn)題
我們可以用dp來(lái)把所有的情況都算出來(lái),最后取他要求的前m大就行
dp[i][j]表示前i個(gè)寶箱,裝的寶物價(jià)值為j的方案數(shù)量,dp=0則說(shuō)明沒(méi)有這種情況
轉(zhuǎn)移方程:
dp [ i ] [ k ] + = dp [ i - 1 ] [ k - a [ i ] [ j ] ] ;
最后把dp [ n ] [ j ] ( j = 1 ~ tot)加起來(lái),不要忘了還有限制條件前k個(gè)
tot是寶物的最大價(jià)值(即每組最貴的寶物之和)

#include<bits/stdc++.h> using namespace std; const int maxn=10200; int a[maxn][maxn]; int dp[maxn][maxn]; int sum=0; int tot=0; int main() {int n,k;int m[maxn];cin>>n>>k;dp[0][0]=1;memset(m,0,sizeof(m));for(int i=1;i<=n;i++){cin>>m[i];for(int j=1;j<=m[i];j++){cin>>a[i][j];sum=max(sum,a[i][j]);}tot+=sum;// cout<<tot<<endl; }sum=0;for (int i = 1; i <= n; i ++)for (int j = 1; j <= m[i]; j ++)for (int k = tot; k >= a[i][j]; k --)dp[i][k] += dp[i - 1][k- a[i][j]];for(int i=1;i<=tot;i++){// cout<<dp[n][i]<<endl;if(k>=dp[n][i]){sum+=i*dp[n][i];k-=dp[n][i];}else {sum+=i*k;break;}}cout<<sum;return 0; }

3. 區(qū)間加
題解:
序列區(qū)間的問(wèn)題可以考慮差分
先注意題目要求:每個(gè)區(qū)間的頭與尾都是不相同的,也就是說(shuō)每個(gè)位置不能同時(shí)放多個(gè)左括號(hào)或右括號(hào),但允許同時(shí)放 ( 和 )
首先我們用a1[]來(lái)存a距離目標(biāo)m差多少
a1 [ ] = m - a [ ]
然后用b來(lái)存a1的差分
b [ i ] = a [ i ] - a [ i - 1 ]
根據(jù)b的值分成四種情況:
1.當(dāng)b<-1||b>1,此時(shí)i-1與i兩個(gè)位置的數(shù),差值大于等于2。比如b=2,意味著i位置的數(shù)要比i-1位置的數(shù)多操作兩次,那就說(shuō)明i-1與i之間要有兩個(gè)左括號(hào)才可以,這樣區(qū)間包括i但是不包括i-1,但題目要求一個(gè)位置不存在多個(gè)左括號(hào),所以遇到這種情況,就說(shuō)明此數(shù)據(jù)根本無(wú)法滿足題目要求,輸出0即可
2.如果b=1,說(shuō)明i要比i-1多操作一次,那就是i-1與i之間有一個(gè)左括號(hào),i-1 ( i,這樣i就在一個(gè)區(qū)間里而i-1不在,i就比i-1多操作一次。
光有左括號(hào)不行還要有右括號(hào),我們可以先把右括號(hào)的位置待定,因?yàn)楹竺娴臄?shù)據(jù)還沒(méi)處理到,你不知道右括號(hào)要放哪,用w來(lái)表示還沒(méi)配對(duì)的左括號(hào)的數(shù)量。b=1時(shí),w++
3.b=-1時(shí),就是上一種情況反過(guò)來(lái),i-1與i之間有一個(gè)右括號(hào),此時(shí)用到右括號(hào),就去看之前有多少左括號(hào),好去配對(duì)
sum用于記錄總值,初始為1
sum+=sumw
有w個(gè)左括號(hào),說(shuō)明此處可以形成w個(gè)區(qū)間,之前已經(jīng)有sum個(gè)區(qū)間了,總區(qū)間數(shù)就是sumw
4.b=0,說(shuō)明i-1與i相等,那他們倆就在同一個(gè)區(qū)間里。我們可以選擇不操作,如果在i之前有左括號(hào),i之后可以放右括號(hào)
sum=sum*w+sum

#include<bits/stdc++.h> typedef long long ll; const ll mod=998244355; const int maxn=2010; ll a[maxn],a1[maxn],b[maxn]; using namespace std; int n,m; ll sum=1,ant; int main() {cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];a1[i]=m-a[i];b[i]=a1[i]-a1[i-1];}int w=0;for(int i=1;i<=n;i++){if(b[i]<-1||b[i]>1){cout<<0;return 0;}else if(b[i]==1)w++;else if(b[i]==-1){sum=(sum*w)%mod;w--;}else if(b[i]==0){sum=(sum*(w+1))%mod;}}cout<<sum;}

4. 多元組
題解:
求長(zhǎng)度為k的遞增子序列的數(shù)量:
想了一陣子,最后還是看了看其他題解
誒呀,要上網(wǎng)課了,等有空再更新最后一個(gè)題

總結(jié)

以上是生活随笔為你收集整理的牛客OI周赛15-普及组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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