1. 程式人生 > 實用技巧 >Codeforces Round #547題解

Codeforces Round #547題解

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;
    
int 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; }
View Code

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);
    int
n; 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; }
View Code

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