zoukankan      html  css  js  c++  java
  • 【Educational Codeforces Round28】

    咸鱼选手发现自己很久不做cf了,晚节不保。

    A.Curriculum Vitae

    枚举一下间断点的位置。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=110;
    int cnt,n,a[N],mx,cur;
    inline int read(){
        int f=1,x=0;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
        do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
        return f*x;
    }
    int main(){
        n=read();
        for(int i=1;i<=n;i++)a[i]=read();
        int flag=0;
        for(int i=1;i<=n;i++){
            cur=0;for(int j=1;j<=i;j++)if(a[j]==0)cur++;
            for(int j=i;j<=n;j++)if(a[j]==1)cur++;
            mx=max(mx,cur);
        }
        printf("%d
    ",mx);
    }

    B. Math Show

    枚举完成了哪些套装,然后剩下的贪心算就好。

    #include<bits/stdc++.h>
    const int N=50;
    typedef long long ll;
    using namespace std;
    int n,m;
    ll a[N],cur,tot,ans,qwq,k;
    int vis[N];
    inline ll read(){
        ll f=1,x=0;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
        do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
        return f*x;
    }
    
    int main(){
        n=read();k=read();m=read();
        for(int i=1;i<=k;i++)a[i]=read(),tot+=a[i];
        sort(a+1,a+k+1);
        if(m>=tot*n){
            ans=1LL*n*(k+1);cout<<ans<<endl;return 0;
        }
        for(int i=0;i<=n;i++){
            ll res=m-1LL*i*tot;
            if(res<0)continue;
            ll cur=0;cur+=1LL*i*(k+1);ll qwq=n-i;
            if(res==0){ans=max(ans,cur);continue;}
            for(int j=1;j<=k;j++){
                if(qwq*a[j]<=res){res-=qwq*a[j];cur+=qwq;if(res<=0)break;continue;}
                if(res<=0)break;
                ll q=res/a[j];cur+=q;break;
            }
            ans=max(ans,cur);
        }
        cout<<ans<<endl;
    }

    老年选手晚节不保,一开始还以为尽量多做整套。

    我是傻逼。

    C. Four Segments

    化简一下式子,然后就可以枚举了。

    #include<bits/stdc++.h>
    typedef long long ll;
    const int N=1000010;
    using namespace std;
    ll s[N],n,ans,x,y,z;
    inline ll read(){
        ll f=1,x=0;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
        do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
        return f*x;
    }
    int main(){
        n=read();
        for(int i=1;i<=n;i++)s[i]=s[i-1]+read();
        for(int i=0;i<=n;i++){
            ll cur=s[i],now=i;
            for(int j=i;j<=n;j++){
                if(s[j]<cur)cur=s[j],now=j;
                if(s[i]-s[now]+s[j]>ans)ans=s[i]-s[now]+s[j],x=i,y=now,z=j;
            }
        }
        printf("%I64d %I64d %I64d
    ",x,y,z);
    }

    D. Monitor

    维护一个二维的前缀和。然后做k次拓展,这样每个点管的就是一个向上k的矩形。

    剩下的就是横向的区间max,500的范围老年选手选择失去梦想的n^3暴力。

    #include<bits/stdc++.h>
    const int N=610;
    using namespace std;
    int n,m,k,q,inf;
    int a[N][N];
    struct Point{int x,y,t;}p[10000010];
    inline int read(){
        int f=1,x=0;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
        do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
        return f*x;
    }
    inline int querymax(int o,int l,int r){
        int ans=0;
        for(int i=l;i<=r;i++)ans=max(a[o][i],ans);
        return ans;
    }
    int ans=0;
    int main(){
        n=read();m=read();k=read();q=read();
        memset(a,127,sizeof(a));inf=a[1][1];ans=inf;
        for(int i=1;i<=q;i++){
            p[i].x=read();p[i].y=read();p[i].t=read();
            a[p[i].x][p[i].y]=p[i].t;
        }
        for(int qwq=1;qwq<k;qwq++)
        for(int i=1;i<n;i++)for(int j=1;j<=m;j++)a[i][j]=max(a[i][j],a[i+1][j]);
        for(int i=1;i+k-1<=n;i++)for(int j=1;j+k-1<=m;j++)
        ans=min(ans,querymax(i,j,j+k-1));
        if(ans==inf)puts("-1");else printf("%d
    ",ans);
    }

    E. Chemistry in Berland

    关系会形成一棵树,这很显然。

    然后就是考虑节点之间的关系,这个关系其实就是树的拓扑序,一边对树拓扑排序一边dp一下,从下面开始先试图用父亲节点满足子节点

    多余的上传到父亲节点即可。

    #include<bits/stdc++.h>
    const int N=100005;
    typedef long long ll;
    const ll inf=(1LL<<60)-1;
    using namespace std;
    ll a[N],b[N],dp[N];
    int n,m,tot,head[N];
    struct Edge{int u,v,next;ll w;}G[N<<1];
    inline void addedge(int u,int v,ll w){
        G[++tot].u=u;G[tot].v=v;G[tot].w=w;G[tot].next=head[u];head[u]=tot;
        G[++tot].u=v;G[tot].v=u;G[tot].w=w;G[tot].next=head[v];head[v]=tot;
    }
    inline void dfs(int u,int f){
        dp[u]=b[u]-a[u];
        for(int i=head[u];i;i=G[i].next){
            int v=G[i].v;ll w=G[i].w;
            if(v==f)continue;
            dfs(v,u);
            if(dp[v]<0){
                if(-dp[v]<inf/w)dp[u]+=dp[v]*w;
                else dp[u]=-inf;
                if(dp[u]<-inf)dp[u]=-inf;
            }
            else dp[u]+=dp[v];
        }
    }
    inline ll read(){
        ll f=1,x=0;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
        do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
        return f*x;
    }
    int main(){
        n=read();
        for(int i=1;i<=n;i++)b[i]=read();
        for(int i=1;i<=n;i++)a[i]=read();
        for(int i=2;i<=n;i++){
            int x=read();ll k=read();
            addedge(i,x,k);
        }
        dfs(1,0);
        puts(dp[1]>=0?"YES":"NO");
    }

    F. Random Query

    这种题栋老师怕不是随便秒。

    考虑一个数对区间的贡献,重复的数记录最后一次出现的位置,最后除所有可能即可。

    #include<bits/stdc++.h>
    const int N=1000010;
    typedef long long ll;
    using namespace std;
    int n,m,a[N],b[N];
    ll ans=0;
    inline int read(){
        int f=1,x=0;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
        do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
        return f*x;
    }
    int main(){
        n=read();
        for(int i=1;i<=n;i++)a[i]=read();
        ll ans=0,t=0;
        for(int i=1;i<=n;i++){
            t+=i-b[a[i]];ans+=t;b[a[i]]=i;
        }
        printf("%.6lf
    ",(ans*2-n)/(double)(1LL*n*n));
    }

    总结:

    1.注意想清楚特判,在提交之前想清楚所有可能情况以及特殊、极端的情况,不要想当然,防止晚节不保

    2.看清楚数据范围,做多次确认。

  • 相关阅读:
    网络流24题之 1738: 最小路径覆盖问题
    POJ 1966 Cable TV Network
    网络流24题- 魔术球问题
    网络流24题之 圆桌问题
    可持久化线段树维护启发式合并的可持久化并查集
    HDU 6166 Senior Pan
    ACM对拍cpp程序
    双联通分量复习
    欧拉回路求路径POJ 2230
    LCA的两种求法
  • 原文地址:https://www.cnblogs.com/zcysky/p/7608087.html
Copyright © 2011-2022 走看看