1. 程式人生 > 實用技巧 >Educational Codeforces Round 62題解

Educational Codeforces Round 62題解

A題

簽到

#include<bits/stdc++.h>
using namespace std; 
int main()
{
    int n,rw=0,t=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int r;
        cin>>r;
        if(r>rw) rw=r;
        if(i>=rw) t++;
    }
    cout<<t<<endl;
    return 0;
}
View Code

B題

前後列舉,看看那個情況小

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=1e6+10;
const int mod=1e9+7;
int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        string s;
        cin
>>s; int cnt1=0,cnt2=0; int i; for(i=0;i<n;i++){ if(s[i]=='<') cnt1++; else break; } for(i=n-1;i>=0;i--){ if(s[i]=='>') cnt2++; else break
; } cout<<min(cnt1,cnt2)<<endl; } return 0; }
View Code

C題

貪心演算法,按照beauty排序之後倒序維護一個優先佇列最大的k個值

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=1e6+10;
const int mod=1e9+7;
struct node{
    ll a,b;
}s[N];
ll sum;
priority_queue<int,vector<int>,greater<int> > q;
bool cmp(node a,node b){
    return a.b<b.b;
}
int main(){
    ios::sync_with_stdio(false);
    int n,k;
    cin>>n>>k;
    int i;
    for(i=1;i<=n;i++){
        cin>>s[i].a>>s[i].b;
    }
    sort(s+1,s+1+n,cmp);
    ll ans=0;
    for(i=n;i>=1;i--){
        int tmp=0;
        if((int)q.size()==k){
            tmp=q.top();
            q.pop();
        }
        ans=max(ans,(sum-tmp+s[i].a)*s[i].b);
        q.push(tmp);
        q.push(s[i].a);
        sum+=s[i].a;
        if((int)q.size()>k){
            sum-=q.top();
            q.pop();
        }
    }
    cout<<ans<<endl;
    return 0;
}
View Code

D題

區間dp三角剖分裸題

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=1e6+10;
const int mod=1e9+7;
ll f[1010][1010];
ll w[N];
int main(){
    ios::sync_with_stdio(false);
    int i;
    int n;
    cin>>n;
    memset(f,-1,sizeof f);
    for(i=1;i<n;i++){
        f[i][i+1]=0;
    }
    for(int len=3;len<=n;len++){
        for(int i=1;i+len-1<=n;i++){
            int j=i+len-1;
            for(int k=i+1;k<j;k++){
                if(f[i][j]==-1||f[i][j]>f[i][k]+f[k][j]+i*j*k)
                f[i][j]=f[i][k]+f[k][j]+i*j*k;
            }
        }
    }
    cout<<f[1][n]<<endl;
    return 0;
}
View Code