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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

2022.3.3
題單地址:https://codeforces.com/contest/999

目錄

  • A. Mishka and Contest【模擬】
  • B. Reversing Encryption【模擬】
  • C. Alphabetic Removals【貪心】
  • D. Equalize the Remainders【貪心+set的用法】
  • E. Reachability from the Capital【強連通 從一個點可以到達所有的點最少加的邊數】
  • F. Cards and Joy【DP】

A. Mishka and Contest【模擬】

#include<bits/stdc++.h> using namespace std; typedef long long int LL; const int N=1e5*5+10; int n,a[N],k,cnt; int main(void) {cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){if(k>=a[i]) cnt++;else break;}for(int i=n;i>=1;i--) {if(k>=a[i]) cnt++;else break;}cout<<min(cnt,n);return 0; }

B. Reversing Encryption【模擬】


題目的意思就是,加密是按照n的因子從大到小翻轉。

例如: n=10 因子有 1,2,5,10 按照從大到小的順序翻轉,即10,5,2,1 故先翻轉[1,10] 再翻轉[1,5] 以此類推

故解密就是逆著進行即可。

#include<bits/stdc++.h> using namespace std; int n; string s; void solve() {set<int>st;for(int i=1;i<=n/i;i++){if(n%i==0)st.insert(i),st.insert(n/i);}for(auto i=st.begin();i!=st.end();i++){int t=*i;reverse(s.begin(),s.begin()+t);}cout<<s; } int main(void) {cin>>n>>s;solve();return 0; }

C. Alphabetic Removals【貪心】


就是先按照順序保存各個位置,按照題目所說的刪除即可。

#include<bits/stdc++.h> using namespace std; string s; vector<int>ve[27]; map<int,int>mp; int n,k; int main(void) {cin>>n>>k>>s;for(int i=0;i<n;i++){ve[s[i]-'a'].push_back(i);} for(int i=0;i<26;i++){for(int j=0;j<ve[i].size();j++){if(k) mp[ve[i][j]]=-1,k--;else break;}if(!k) break;}for(int i=0;i<s.size();i++) {if(mp[i]) continue;cout<<s[i];}return 0; }

D. Equalize the Remainders【貪心+set的用法】

#include<bits/stdc++.h> using namespace std; const int N=1e5*2+10; typedef long long int LL; LL a[N],cnt[N],n,m,ans; set<int>s; int main(void) {cin>>n>>m;for(int i=0;i<m;i++) s.insert(i);//將所有的余數先存起來int k=n/m;for(int i=0;i<n;i++){cin>>a[i];int d=a[i]%m,x;if(d>*s.rbegin()) x=*s.begin();//比最大的還大,那么最優的就是最小的 else x=*s.lower_bound(d);//找到大于等于d的最近的值 cnt[x]++;if(cnt[x]==k) s.erase(x);//夠了就刪除 ans+=(x-d+m)%m;a[i]+=(x-d+m)%m;}cout<<ans<<endl;for(int i=0;i<n;i++) cout<<a[i]<<" ";return 0; }

E. Reachability from the Capital【強連通 從一個點可以到達所有的點最少加的邊數】

  • 首先進行dfs對所有可以由s直接到達(不添加邊)的點做一個標記。
  • 然后對于其他需要添加邊到達的點,同樣進行dfs,很明顯,如果節點u是某一個需要添加邊的分量的樹的根節點,最優解只需要從s添加一條邊到這個根節點u就行了。最后只需要判斷有幾個這樣的根節點就ok了。
#include<bits/stdc++.h> using namespace std; const int N=1e5*3+10; int h[N],e[N],ne[N],idx; int n,m,s,flag[N],vis[N]; map<int,int>mp; void add(int a,int b) {e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void dfs(int u) {flag[u]=0,vis[u]=1;for(int i=h[u];i!=-1;i=ne[i]) {int j=e[i];if(!vis[j]) dfs(j);} } int main(void) {cin>>n>>m>>s;memset(h,-1,sizeof h);for(int i=1;i<=n;i++) flag[i]=1;while(m--){int a,b; cin>>a>>b;add(a,b); }dfs(s);int cnt=0;for(int i=1;i<=n;i++){if(flag[i]){memset(vis,0,sizeof vis);dfs(i);flag[i]=1;//根節點 //注意不要在這直接統計根節點,因為這可能并不是一個根節點而是一個樹上的一支而已。}}for(int i=1;i<=n;i++) cnt+=flag[i];//所有的根節點cout<<cnt;return 0; }

F. Cards and Joy【DP】


需要注意的是,那些都不喜歡的卡片是沒有價值的。

#include<bits/stdc++.h> using namespace std; typedef long long int LL; const int N=510; const int M=1e5+10; int n,k; int people[M],card[M],h[N]; //card[i] 表示數字i卡片的數量 //people[i] 表示喜歡i卡片的人的數量 LL dp[N*10][N];//dp[i][j] 表示i張相同的牌,發給j個喜歡這張牌的人的最大價值 int main(void) {cin>>n>>k;for(int i=1;i<=n*k;i++){int x; cin>>x;card[x]++;}for(int i=1;i<=n;i++){int x; cin>>x;people[x]++;}for(int i=1;i<=k;i++) cin>>h[i];for(int i=1;i<=n*k;i++)//卡片{dp[i][1]=h[min(i,k)];for(int j=2;j<=n;j++)//人{for(int z=0;z<=min(i,k);z++){dp[i][j]=max(dp[i][j],dp[i-z][j-1]+h[z]);}}}long long int sum=0;for(int i=0;i<M;i++) if(people[i]) sum+=dp[card[i]][people[i]];cout<<sum<<endl;return 0; }

總結

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

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