CF3

Posted knife-rose

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF3相关的知识,希望对你有一定的参考价值。

A

A

直接(Baidu First Search)

#include<bits/stdc++.h>
using namespace std;
namespace red{
#define y1 qwq
#define int long long
#define eps (1e-6)
    inline int read()
    {
        int x=0;char ch,f=1;
        for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
        if(ch=='-') f=0,ch=getchar();
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    string st,ed;
    struct node
    {
        int x,y,f;
    };
    queue<node> q;
    int dx[]={0,-1,1,0,0,-1,1,1,-1},dy[]={0,0,0,-1,1,-1,1,-1,1};
    string s[]={"Q","U","D","L","R","LU","RD","LD","RU"};
    int g[20][20];
    inline void bfs(int stx,int sty,int edx,int edy)
    {
        stx=8-stx+1,edx=8-edx+1;
        q.push((node){stx,sty,0});
        g[stx][sty]=-1;
        while(!q.empty())
        {
            node now=q.front();
            q.pop();
            int x=now.x,y=now.y;
            if(x==edx&&y==edy)
            {
                cout<<now.f<<endl;
                while(~g[x][y])
                {
                    cout<<s[g[x][y]]<<endl;
                    int t=g[x][y]&1?g[x][y]+1:g[x][y]-1;
                    x+=dx[t],y+=dy[t];
                }
                return;
            }
            for(int k=1;k<=8;++k)
            {
                int tx=x+dx[k],ty=y+dy[k];
                if(tx<1||tx>8||ty<1||ty>8) continue;
                if(g[tx][ty]) continue;
                g[tx][ty]=k;
                q.push((node){tx,ty,now.f+1});
            }
        }
    }
    inline void main()
    {
        cin>>st>>ed;
        bfs(st[1]-'0',st[0]-'a'+1,ed[1]-'0',ed[0]-'a'+1);
    }
}
signed main()
{
    red::main();
    return 0;
}

B

B

我脑残我脑残

把重量为(1)的物品和重量为(2)的物品分类,从小到大排序

然后枚举用几个重量为(1)的物品

#include<bits/stdc++.h>
using namespace std;
namespace red{
#define y1 qwq
#define int long long
#define eps (1e-6)
    inline int read()
    {
        int x=0;char ch,f=1;
        for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
        if(ch=='-') f=0,ch=getchar();
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=1e5+10;
    int n,m;
    int ret,numa,numb;
    int st[N],top;
    int tota,totb;
    int sa[N],sb[N];
    struct point
    {
        int val,id;
        inline bool operator < (const point &t) const
        {
            return val>t.val;
        }
    }a[N],b[N];
    inline void main()
    {
        n=read(),m=read();
        for(int x,y,i=1;i<=n;++i)
        {
            x=read(),y=read();
            if(x==1) a[++tota].val=y,a[tota].id=i;
            else b[++totb].val=y,b[totb].id=i;
        }
        sort(a+1,a+tota+1);
        sort(b+1,b+totb+1);
        for(int i=1;i<=tota;++i) sa[i]=sa[i-1]+a[i].val;
        for(int i=1;i<=totb;++i) sb[i]=sb[i-1]+b[i].val;
        for(int i=0;i<=min(m,tota);++i)
        {
            int sumb=min((m-i)>>1,totb);
            if(sa[i]+sb[sumb]>ret)
            {
                ret=sa[i]+sb[sumb];
                numa=i;
                numb=sumb;
            }
        }
        for(int i=1;i<=numa;++i) st[++top]=a[i].id;
        for(int i=1;i<=numb;++i) st[++top]=b[i].id; 
        printf("%lld
",ret);
        sort(st+1,st+top+1);
        for(int i=1;i<=top;++i) printf("%lld
",st[i]);
    }
}
signed main()
{
    red::main();
    return 0;
}
//qnmd

C

C

淦,毒瘤模拟

考虑很多不合法情况:

1.第一个人比第二个人多2个以上

2.第二个人比第一个人多

3.两个人都赢了

4.一个人赢两次(包括有两行或两列,一个人有两个点赢了超过两次但交点超过两个)

5.某个人赢了另一个人还走了下一步

然后其他情况应该比较好判断

#include<bits/stdc++.h>
using namespace std;
namespace red{
#define y1 qwq
#define int long long
#define eps (1e-6)
    inline int read()
    {
        int x=0;char ch,f=1;
        for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
        if(ch=='-') f=0,ch=getchar();
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    char s[5][5];
    int sum1,sum2;
    bool flag1,flag2;
    int d1[5][5],d2[5][5];
    inline void main()
    {
        for(int i=1;i<=3;++i) scanf("%s",s[i]+1);
        for(int i=1;i<=3;++i)
        {
            for(int j=1;j<=3;++j)
            {
                if(s[i][j]=='X') ++sum1;
                if(s[i][j]=='0') ++sum2;
            }
        }
        if(sum1-sum2>1||sum2>sum1)
        {
            puts("illegal");return;
        }
        for(int i=1;i<=3;++i)
        {
            int sa=0,sb=0;
            for(int j=1;j<=3;++j)
            {
                if(s[i][j]=='X') ++sa;
                if(s[i][j]=='0') ++sb;
            }
            if(flag1&&sa==3){puts("illegal");return;}
            if(flag2&&sb==3){puts("illegal");return;}
            flag1|=(sa==3),flag2|=(sb==3);
            if(sa==3) for(int j=1;j<=3;++j) ++d1[i][j];
            if(sb==3) for(int j=1;j<=3;++j) ++d2[i][j];
        }
        bool q1=0,q2=0;
        for(int i=1;i<=3;++i)
        {
            int sa=0,sb=0;
            for(int j=1;j<=3;++j)
            {
                if(s[j][i]=='X') ++sa;
                if(s[j][i]=='0') ++sb;
            }
            if(q1&&sa==3){puts("illegal");return;}
            if(q2&&sb==3){puts("illegal");return;}
            q1|=(sa==3),q2|=(sb==3);
            if(sa==3) for(int j=1;j<=3;++j) ++d1[j][i];
            if(sb==3) for(int j=1;j<=3;++j) ++d2[j][i];
        }
        flag1|=q1,flag2|=q2;
        int sa=0,sb=0;
        for(int i=1;i<=3;++i)
        {
            if(s[i][i]=='X') ++sa;
            if(s[i][i]=='0') ++sb;
        }
        flag1|=(sa==3),flag2|=(sb==3);
        if(sa==3) for(int i=1;i<=3;++i) ++d1[i][i];
        if(sb==3) for(int i=1;i<=3;++i) ++d2[i][i];
        sa=sb=0;
        for(int i=1;i<=3;++i)
        {
            sa+=(s[i][3-i+1]=='X');
            sb+=(s[i][3-i+1]=='0');
        }
        flag1|=(sa==3),flag2|=(sb==3);
        if(sa==3) for(int i=1;i<=3;++i) ++d1[i][3-i+1];
        if(sb==3) for(int i=1;i<=3;++i) ++d2[i][3-i+1];
        int tot1=0,tot2=0;
        for(int i=1;i<=3;++i)
        {
            for(int j=1;j<=3;++j)
            {
                if(d1[i][j]>1) ++tot1;
                if(d2[i][j]>1) ++tot2;
            }
        }
        if((flag1&&flag2)||(tot1>1)||(tot2>1))
        {
            puts("illegal");return;
        }
        if((flag2&&sum1>sum2)||(flag1&&sum1==sum2))
        {
            puts("illegal");return;
        }
        if(flag1)
        {
            puts("the first player won");
            return;
        }
        if(flag2)
        {
            puts("the second player won");
            return;
        }
        if(sum1+sum2==9)
        {
            puts("draw");
            return;
        }
        if(sum1==sum2)
        {
            puts("first");
            return;
        }
        if(sum1>sum2)
        {
            puts("second");
            return;
        }
    }
}
signed main()
{
    red::main();
    return 0;
}

D

D

先都把括号看作右括号,然后将(a[i]-b[i])扔进堆,然后遇到左括号就 (++sum),否则(--sum)

如果(sum<0),那么从堆顶取一个元素出来代替右括号,(sum+=2)

如果最后(sum!=0)或者某次堆顶没有元素则无解

#include<bits/stdc++.h>
using namespace std;
namespace red{
#define y1 qwq
#define int long long
#define eps (1e-6)
    inline int read()
    {
        int x=0;char ch,f=1;
        for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
        if(ch=='-') f=0,ch=getchar();
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=1e5+10;
    struct node
    {
        int val,pos;
        inline bool operator < (const node &t) const
        {
            return val>t.val;
        }
    };
    priority_queue<node> q;
    char s[N];
    int n,m,sum;
    int ret;
    int g[N];
    inline void main()
    {
        scanf("%s",s+1);
        n=strlen(s+1);
        sum=0;
        for(int x,y,i=1;i<=n;++i)
        {
            if(s[i]=='(') ++sum,g[i]=2;
            else --sum,g[i]=3;
            
            if(s[i]=='?')
            {
                x=read(),y=read();
                ret+=y;
                q.push((node){x-y,i});
            }
            
            if(sum<0)
            {
                if(q.empty()) {ret=-1;break;}
                sum+=2;
                node t=q.top();
                q.pop();
                g[t.pos]=2;
                ret+=t.val;
            }
        }
        if(ret==-1||sum)
        {
            puts("-1");
            return;
        }
        printf("%lld
",ret);
        for(int i=1;i<=n;++i)
        {
            putchar(g[i]==2?'(':')');
        }
    }
}
signed main()
{
    red::main();
    return 0;
}
/*
kkk
*/

以上是关于CF3的主要内容,如果未能解决你的问题,请参考以下文章

CF3A Shortest path of the king

CF3D Least Cost Bracket Sequence 题解——贪心

cf3D Least Cost Bracket Sequence

CF3D Least Cost Bracket Sequence 贪心

CF3A Shortest path of the king

C 语言:使用计算初始化浮点变量