• 【LGR-047】洛谷5月月赛


    这次我期待了很久的Luogu月赛崩掉了

    传说中的Luogu神机就这样被卡爆了

    然后我过了20min才登上Luogu的网站,30min后才看到题目

    然后交T1TM的不给我测!!!然后又交了一次机子就炸了,好几个点都不测

    然后感觉游戏体验极差。交了一波T2又有一堆点不给我测,还莫名T了几个点这机子真的

    然后就直接关掉睡觉去了

    不过说实话题目还是很好的,值得深思一下

    A: T29693 取石子

    这道题目还是很良心的,水的一批

    首先注意到因为a[0]=0,因此只要石子没取光就一定可以继续取

    然后判断一下Σa[i]的奇偶性即可

    CODE

    #include<cstdio>
    using namespace std;
    int x,n; 
    long long tot;
    inline char tc(void)
    {
        static char fl[100000],*A=fl,*B=fl;
        return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
    }
    inline void read(int &x)
    {
        x=0; char ch=tc();
        while (ch<'0'||ch>'9') ch=tc();
        while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
    }
    int main()
    {
        //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
        register int i; read(n);
        for (i=1;i<=n;++i)
        read(x),tot+=x;
        puts(tot%2?"Alice":"Bob");
        return 0;
    }
    

    B: T30204 偷上网

    这道题还是比较欧洲玄学

    首先当n=1时,半径为l,因此我们枚举一下四个角落是否满足条件即可,否则输出GG

    当n>=2时,由于圆的面积绝对小于正方形的面积,所以一定有解

    但是怎么找到那个解呢?

    rand大法好,我们直接上rand判断是否可行即可

    虽然有大佬给出证明n>=2时在边上一定能找到点,但是这里rand真心快,全部0ms卡过去了,所以也没去打别的算法了

    randCODE

    #include<cstdio>
    #include<cstdlib>
    #include<ctime>
    #include<cmath>
    using namespace std;
    typedef double DB;
    const int N=15;
    const DB EPS=1e-6;
    int n,l;
    DB x[N],y[N];
    inline DB calc(DB a,DB b,DB c,DB d)
    {
        return sqrt((a-c)*(a-c)+(b-d)*(b-d));
    }
    inline void sp_work(int l)
    {
        if (calc(0.0,0.0,x[1],y[1])>=(DB)l/n+EPS) { printf("%.3lf %.3lf",0.0,0.0); exit(0); }
        if (calc(0.0,(DB)l,x[1],y[1])>=(DB)l/n+EPS) { printf("%.3lf %.3lf",0.0,(DB)l); exit(0); }
        if (calc((DB)l,0.0,x[1],y[1])>=(DB)l/n+EPS) { printf("%.3lf %.3lf",(DB)l,0.0); exit(0); }
        if (calc((DB)l,(DB)l,x[1],y[1])>=(DB)l/n+EPS) { printf("%.3lf %.3lf",(DB)l,(DB)l); exit(0); }
        puts("GG"); return;
    }
    inline void com_work(int l)
    {
        for (;;)
        {
            DB a=rand()%l+(DB)(rand()%1000)/1000,b=rand()%l+(DB)(rand()%1000)/1000; bool flag=1;
            for (register int i=1;i<=n;++i)
            if (calc(a,b,x[i],y[i])<(DB)l/n+EPS) { flag=0; break; }
            if (flag) { printf("%.3lf %.3lf",a,b); exit(0); }
        }
    }
    int main()
    {
        srand(time(0)); register int i; 
        scanf("%d%d",&n,&l);
        for (i=1;i<=n;++i)
        scanf("%lf%lf",&x[i],&y[i]);
        if (n==1) sp_work(l); else com_work(l);
        return 0;
    }
    

    C: T28881 粘骨牌

    这是一道比较需要思维的题目了

    首先我们先来考虑GG的情况,这个很简单,除非起点就是特殊点,要不然不可能会GG

    这个还是很简单的,因为就算其他点都是特殊点,我大不了把所有骨牌都固定住,这样其他点就露不出来了

    然后我们考虑建边,对于所有的点,我们向它有可能可以到达的点建边,边权就是固定这个骨牌的代价

    然后我们简单分析一下,就可以发现这是一棵树,因为每一个骨牌都可以连出两条边,并且不可能有环

    然后就要求最小的代价割掉所有点,所以我们考虑树形DP

    设f[x]表示割掉x及其所有字数中的特殊点的最小代价,则

    f[x]=v[fa[x]][x] (if x is a special node)

    f[x]=Σmin(v[x][son[x]],f[son[x]]) ( if x is a common node)

    然后我们发现这个建图可以和DP的过程一起写成一个类似记搜的方法,然后刚上去就可以了

    CODE

    #include<cstdio>
    using namespace std;
    const int N=1005,fx[4]={0,1,0,-1},fy[4]={1,0,-1,0};
    int a[N][N],c[N*N],n,m,k,t,x,y,s_x,s_y;
    bool sp[N][N];
    inline char tc(void)
    {
        static char fl[100000],*A=fl,*B=fl;
        return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
    }
    inline void read(int &x)
    {
        x=0; char ch=tc();
        while (ch<'0'||ch>'9') ch=tc();
        while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
    }
    inline long long min(long long a,long long b)
    {
        return a<b?a:b;
    }
    inline bool check(int x,int y)
    {
        return x>=1&&x<=n&&y>=1&&y<=m;
    }
    inline long long DFS(int x,int y)
    {
        long long ans=0;
        for (register int i=0;i<4;++i)
        {
            int xx=x+fx[i]*2,yy=y+fy[i]*2;
            if (check(xx,yy)&&a[x+fx[i]][y+fy[i]]==a[xx][yy])
            {
                if (sp[xx][yy]) ans+=c[a[xx][yy]]; else ans+=min(DFS(xx,yy),c[a[xx][yy]]);
            }
        }
        return ans;
    }
    int main()
    {
        //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
        register int i,j;
        read(n); read(m); read(k); t=n*m-1>>1;
        for (i=1;i<=t;++i)
        read(c[i]);
        for (i=1;i<=k;++i)
        read(x),read(y),sp[x][y]=1;
        for (i=1;i<=n;++i)
        for (j=1;j<=m;++j)
        {
            read(a[i][j]);
            if (!a[i][j]) s_x=i,s_y=j;
        }
        if (sp[s_x][s_y]) puts("GG"); else printf("%lld",DFS(s_x,s_y));
        return 0;
    }
    

    D: T30208 太极剑&&E: T30212 玩游戏

    这两题还是太难了,自己看题解也看不懂吧

    留着以后填

  • 相关阅读:
    Java BEAN与EJB的区别
    Java设计模式(22)命令模式(Command模式)
    Java设计模式(21)访问模式(Visitor者模式)
    Java设计模式(20)观察者模式(Observer模式)
    Java设计模式(19)状态模式(State模式)
    Java设计模式(18)策略模式(Strategy模式)
    Java设计模式(17)解释器模式(Interpreter模式)
    Java设计模式(16)中介模式(Mediator模式)
    Java设计模式(15)备忘录模式(Memento模式)
    C# SignalR 即时通讯 聊天室
  • 原文地址:https://www.cnblogs.com/cjjsb/p/9076443.html
Copyright © 2020-2023  润新知