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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces Round #496 (Div. 3)【未完结】

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #496 (Div. 3)【未完结】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2022.3.5
題目地址:https://codeforces.com/contest/1005

目錄

  • A. Tanya and Stairways【找規律】
  • B. Delete from the Left【模擬】
  • C. Summarize to the Power of Two【哈希表】
  • D. Polycarp and Div 3【DP】
  • E1. Median on Segments (Permutations Edition)【思維】

A. Tanya and Stairways【找規律】

#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int n,a[N]; vector<int>ve; int main(void) {cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++)if(a[i]>=a[i+1]) ve.push_back(a[i]);cout<<ve.size()<<endl;for(int i=0;i<ve.size();i++) cout<<ve[i]<<" ";return 0; }

B. Delete from the Left【模擬】


因為只能從前往后刪,故就是求最長的相同的后綴

#include<bits/stdc++.h> using namespace std; int main(void) {string a,b; cin>>a>>b;int cnt =0;for(int i=a.size()-1,j=b.size()-1;i>=0;i--){if(a[i]==b[j]) j--,cnt++;else break;}cout<<a.size()-cnt+b.size()-cnt; }

C. Summarize to the Power of Two【哈希表】


就是貪心,對于一個數枚舉所有的可以和它匹配的數,然后記錄。
注意標記,避免重復計算。

#include<bits/stdc++.h> using namespace std; map<int,int>mp,st; int s[35],n,x; int main(void) {cin>>n;for(int i=0;i<n;i++) cin>>x,mp[x]++;for(int i=1,j=1;i<=31;i++,j*=2) s[i]=j;int sum=0;for(auto i=mp.begin();i!=mp.end();i++){x=i->first;for(int j=1;j<=31;j++){if(s[j]>x){int x1=x,x2=s[j]-x;if(mp.count(x1)==0||mp.count(x2)==0) continue;//倆數有一個不存在if(x1==x2)//相等{if(st[x1]) continue;//計算過了if(mp[x1]<2) continue;//個數小于2sum+=mp[x2];st[x1]=1;}else{if(!st[x1]) sum+=mp[x1];//加過了if(!st[x2]) sum+=mp[x2];//加過了st[x1]=1,st[x2]=1;//記錄已經選過了}}}}cout<<n-sum<<endl;return 0; }

D. Polycarp and Div 3【DP】


dp[i] 表示前i個字符切割后 最多的可以被三整除的數字個數

#include<bits/stdc++.h> using namespace std; const int N=1e5*2+10; int n,dp[N],s[N]; int main(void) {string a; cin>>a;n=a.size();a="0"+a;for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]-'0';for(int i=1;i<=n;i++){for(int j=1;j<=min(i,100);j++)//取后面的100個狀態來轉移 其實取10個就行了{int sum=s[i]-s[i-j];if(sum%3) dp[i]=max(dp[i],dp[i-j]);else dp[i]=max(dp[i],dp[i-j]+1);}}cout<<dp[n];return 0; }

E1. Median on Segments (Permutations Edition)【思維】

  • 如果區間長度是偶數:則區間內小于等于m的數量等于大于m的數量
  • 如果區間長度是奇數:則區間內小于等于m的數量等于大于m的數量+1

設區間內小于等于m的數量為a,區間內大于m的數量為b,故:

  • b-a=0
  • b-a=-1
#include<bits/stdc++.h> using namespace std; const int N=1e5*2+10; typedef long long int LL; map<int,int>mp; LL n,m,ans,a[N]; int main(void) {cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];int pos,cnt=0;for(int i=1;i<=n;i++) if(a[i]==m) pos=i;for(int i=pos;i>=1;i--){if(a[i]>m) cnt++;else if(a[i]<m)cnt--;mp[cnt]++;}cnt=0;//cnt表示的是大于m的數的個數和小于m的數的個數的差值for(int i=pos;i<=n;i++){if(a[i]>m) cnt++;else if(a[i]<m) cnt--;ans+=mp[-cnt];ans+=mp[-cnt+1];}cout<<ans;return 0; }

總結

以上是生活随笔為你收集整理的Codeforces Round #496 (Div. 3)【未完结】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。