Codeforces Round #547題解
阿新 • • 發佈:2020-12-25
A題
先除再計算即可
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; typedef pair<int,int> plll; const int N=3e5+10; const int inf=0x3f3f3f3f; int main(){ ios::sync_with_stdio(false); int n,m; cin>>n>>m; int flag=0;View Codeint cnt=0; if(m%n){ cout<<-1<<endl; return 0; } n=m/n; while(n%2==0){ n/=2; cnt++; } while(n%3==0){ n/=3; cnt++; } if(n==1){ cout<<cnt<<endl; } else{ cout<<-1<<endl; }return 0; }
B題
因為保證存在一個,因此直接擴大一倍,這樣答案肯定在這之間
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; typedef pair<int,int> plll; const int N=4e5+10; const int inf=0x3f3f3f3f; int a[N]; int main(){ ios::sync_with_stdio(false); intView Coden; cin>>n; int i; for(i=1;i<=n;i++) cin>>a[i]; for(i=n+1;i<=2*n;i++){ a[i]=a[i-n]; } int ans=0; int cnt=0; for(i=1;i<=2*n;i++){ if(a[i]==0){ ans=max(ans,cnt); cnt=0; } else{ cnt++; } } cout<<ans<<endl; return 0; }
C題
因為排列是每個都不同,因此用字首和計算出最大的那個,那個就是n
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; typedef pair<int,int> plll; const int N=4e5+10; const int inf=0x3f3f3f3f; int p[N]; ll sum; int ans[N],st[N]; int main(){ ios::sync_with_stdio(false); int n; cin>>n; int i; int pos=1; int mx=0; for(i=2;i<=n;i++){ cin>>p[i]; sum+=p[i]; if(sum>mx){ sum=mx; pos=i; } } ans[pos]=n; st[n]=1; for(i=pos-1;i>=1;i--){ ans[i]=ans[i+1]-p[i+1]; if(ans[i]<=0||ans[i]>n||st[ans[i]]){ cout<<-1<<endl; return 0; } st[ans[i]]=1; } for(i=pos+1;i<=n;i++){ ans[i]=ans[i-1]+p[i]; if(ans[i]<=0||ans[i]>n||st[ans[i]]){ cout<<-1<<endl; return 0; } st[ans[i]]=1; } for(i=1;i<=n;i++){ cout<<ans[i]<<" "; } cout<<endl; return 0; }View Code
D題
發現每一位是獨立的,因此用每一位進行匹配,之後再用多餘的?進行匹配
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; typedef pair<int,int> plll; const int N=4e5+10; const int inf=0x3f3f3f3f; int a[N]; int b[N]; vector<int> num1[27]; vector<int> num2[27]; vector<int> res1,res2; vector<pll> ans; int main(){ ios::sync_with_stdio(false); int n; cin>>n; int i; string s; cin>>s; s=" "+s; for(i=1;i<(int)s.size();i++){ if(s[i]=='?'){ num1[26].push_back(i); } else{ int x=s[i]-'a'; num1[x].push_back(i); } } cin>>s; s=" "+s; for(i=1;i<(int)s.size();i++){ if(s[i]=='?') num2[26].push_back(i); else{ int x=s[i]-'a'; num2[x].push_back(i); } } int cnt=0; for(i=0;i<26;i++){ while((int)num1[i].size()&&(int)num2[i].size()){ int x=num1[i].back(); int y=num2[i].back(); num1[i].pop_back(); num2[i].pop_back(); ans.push_back({x,y}); } while((int)num1[i].size()){ res1.push_back(num1[i].back()); num1[i].pop_back(); } while((int)num2[i].size()){ res2.push_back(num2[i].back()); num2[i].pop_back(); } } for(auto x:res2){ if(num1[26].size()){ ans.push_back({num1[26].back(),x}); num1[26].pop_back(); } } for(auto x:res1){ if(num2[26].size()){ ans.push_back({x,num2[26].back()}); num2[26].pop_back(); } } while((int)num1[26].size()&&(int)num2[26].size()){ int x=num1[26].back(); int y=num2[26].back(); num1[26].pop_back(); num2[26].pop_back(); ans.push_back({x,y}); } cout<<ans.size()<<endl; for(auto x:ans){ cout<<x.first<<" "<<x.second<<endl; } return 0; }View Code
E題
很明顯的二分演算法,答案的輪數具有單調性,因此列舉每一位,以他結束的答案,之後全部答案取min就是最後答案
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; typedef pair<int,int> plll; const int N=4e5+10; const int inf=0x3f3f3f3f; ll d[N]; ll sum[N]; ll res[N]; int main(){ ios::sync_with_stdio(false); ll h,n; cin>>h>>n; int i; int flag=0; for(i=1;i<=n;i++){ cin>>d[i]; sum[i]=sum[i-1]+d[i]; if(sum[i]<=-h){ cout<<i<<endl; return 0; } } if(sum[n]>=0){ cout<<-1<<endl; return 0; } ll ans=1e18; for(i=1;i<=n;i++){ ll l=0,r=1e12; while(l<r){ ll mid=l+r>>1; if(1.0*sum[n]<=1.0*(-h-sum[i])/mid){ r=mid; } else{ l=mid+1; } } ans=min(ans,l*n+i); } cout<<ans<<endl; return 0; }View Code