• Codeforces ECR52 div2翻车记


      A:签到。

    #include<iostream> 
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int read()
    {
        int x=0,f=1;char c=getchar();
        while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
        while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
        return x*f;
    }
    #define ll long long
    int t,a,b,c,d;
    int main()
    {
        t=read();
        while (t--)
        {
            a=read(),b=read(),c=read(),d=read();
            cout<<a/d+1ll*a/d/b*c<<endl;
        }
        return 0;
    }
    View Code

      B:long long。

    #include<iostream> 
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int read()
    {
        int x=0,f=1;char c=getchar();
        while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
        while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
        return x*f;
    }
    #define N 100010
    long long n,m;
    int main()
    {
        cin>>n>>m;
        cout<<max(n-m*2,0ll)<<' ';
        for (long long i=0;i<=n;i++) if (i*(i-1)/2>=m) {cout<<n-i;break;}
        return 0;
    }
    View Code

      C:从大到小排序后贪心地修改。我猜我是唯一一个C花掉的时间比D多的。

    #include<iostream> 
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int read()
    {
        int x=0,f=1;char c=getchar();
        while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
        while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
        return x*f;
    }
    #define N 200010
    int n,m,a[N],ans=0;
    int main()
    {
        n=read(),m=read();
        for (int i=1;i<=n;i++) a[i]=read();
        sort(a+1,a+n+1);reverse(a+1,a+n+1);
        for (int i=1;a[i]!=a[n];)
        {
            int t=i;long long tot=0;
            while (t<n&&tot+1ll*(a[t]-a[t+1])*t<=m) tot+=(a[t]-a[t+1])*t,t++;
            ans++;
            i=t;a[i]-=(m-tot)/t;
        }
        cout<<ans;
        return 0;
    }
    View Code

      D:做法非常显然,每个位置拆点跑个最短路然后大力dp就行了,码农题。

    #include<iostream> 
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int read()
    {
        int x=0,f=1;char c=getchar();
        while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
        while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
        return x*f;
    }
    #define N 12
    int n,f[N*N][3],g[N*N][3],dis[N*N*3][N*N*3],dis2[N*N*3][N*N*3];
    struct data{int x,y;
    }a[N*N];
    int wx[8]={1,1,-1,-1,2,2,-2,-2},wy[8]={2,-2,2,-2,1,-1,1,-1};
    int trans(int p,int x,int y){return p*n*n+(x-1)*n+y;}
    void getdis()
    {
        memset(dis,42,sizeof(dis));memset(dis2,42,sizeof(dis2));
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                for (int x=1;x<=n;x++)
                    for (int y=1;y<=n;y++)
                    if (i==x||j==y) dis[trans(0,i,j)][trans(0,x,y)]=1,dis2[trans(0,i,j)][trans(0,x,y)]=0;
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                for (int k=0;k<8;k++)
                if (i+wx[k]>=1&&j+wy[k]>=1&&i+wx[k]<=n&&j+wy[k]<=n)
                dis[trans(1,i,j)][trans(1,i+wx[k],j+wy[k])]=1,dis2[trans(1,i,j)][trans(1,i+wx[k],j+wy[k])]=0;
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                for (int x=1;x<=n;x++)
                    for (int y=1;y<=n;y++)
                    if (i+j==x+y||i-j==x-y) dis[trans(2,i,j)][trans(2,x,y)]=1,dis2[trans(2,i,j)][trans(2,x,y)]=0;
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                for (int x=0;x<3;x++)
                    for (int y=0;y<3;y++)
                    dis[trans(x,i,j)][trans(y,i,j)]=dis2[trans(x,i,j)][trans(y,i,j)]=(x!=y);
        for (int k=1;k<=3*n*n;k++)
            for (int i=1;i<=3*n*n;i++) 
                for (int j=1;j<=3*n*n;j++)
                if (dis[i][k]+dis[k][j]<dis[i][j]||dis[i][k]+dis[k][j]==dis[i][j]&&dis2[i][k]+dis2[k][j]<dis2[i][j])
                dis[i][j]=dis[i][k]+dis[k][j],dis2[i][j]=dis2[i][k]+dis2[k][j];
    }
    void update(int i,int p)
    {
        for (int j=0;j<3;j++)
        if (f[i-1][j]+dis[trans(j,a[i-1].x,a[i-1].y)][trans(p,a[i].x,a[i].y)]<f[i][p]||
            f[i-1][j]+dis[trans(j,a[i-1].x,a[i-1].y)][trans(p,a[i].x,a[i].y)]==f[i][p]
            &&g[i-1][j]+dis2[trans(j,a[i-1].x,a[i-1].y)][trans(p,a[i].x,a[i].y)]<g[i][p])
            f[i][p]=f[i-1][j]+dis[trans(j,a[i-1].x,a[i-1].y)][trans(p,a[i].x,a[i].y)],
            g[i][p]=g[i-1][j]+dis2[trans(j,a[i-1].x,a[i-1].y)][trans(p,a[i].x,a[i].y)];
    }
    int main()
    {
        n=read();
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
            {
                int x=read();
                a[x].x=i,a[x].y=j;
            }
        getdis();
        memset(f,42,sizeof(f));memset(g,42,sizeof(g));
        f[1][0]=f[1][1]=f[1][2]=g[1][0]=g[1][1]=g[1][2]=0;
        for (int i=2;i<=n*n;i++)
        update(i,0),update(i,1),update(i,2);
        int x=0;
        if (f[n*n][1]<f[n*n][0]||f[n*n][1]==f[n*n][0]&&g[n*n][1]<g[n*n][0]) x=1;
        if (f[n*n][2]<f[n*n][x]||f[n*n][2]==f[n*n][x]&&g[n*n][2]<g[n*n][x]) x=2;
        cout<<f[n*n][x]<<' '<<g[n*n][x];
        return 0;
    }
    View Code

      然后就并没有时间看题了。不过E是置换并没有真的学过那大概也不算翻车了。

       upd:于是就发现F是个傻逼题。将所有边连上缩个点dp一发即可。

      result:rank 217 rating +7 迷之稳定。

  • 相关阅读:
    C# 使用NPlot绘图技巧
    jsp页面必填项如何加红星号*
    org.mybatis.spring.mapper.MapperScannerConfigurer 类作用
    mybatis对java自定义注解的使用——入门篇
    1.报表TIBCO Jaspersoft Studio工具教程入门--生成jrxml和jasper文件 然后拖拽到项目中 跟ireport一样
    eclipse安装weblogic Server服务器
    创建一个java项目并部署到weblogic服务器
    weblogicjsp编译:查看编译后的java中间代码
    html标签的target属性应用
    5.把报表集成到Web应用程序中-生成网页和导出两种方式
  • 原文地址:https://www.cnblogs.com/Gloid/p/9775983.html
Copyright © 2020-2023  润新知