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
原文地址:https://www.cnblogs.com/ctyakwf/p/14203251.html