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是置换并没有真的学过那大概也不算翻车了。

猜你喜欢

转载自www.cnblogs.com/Gloid/p/9775983.html