2023ccpc女生赛非官方题解

A.疾羽的救赎(模拟)

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
map<int,int>m;//用来记录不同棋子的坐标 
vector<int>res[N];//用来记录每一格子上棋子的叠加状态,只存放1,2,3分别代表紫色,绿色,黄色棋子 
int t,z=1,l=2,h=3;
void solve(int g,int a,int b)
{
    if(b>0)
    {
        int pos;
        bool flag=false;
        int x=m[a];//当前a棋子的坐标 
        for(int i=0;i<res[x].size();i++) //判断当前这个坐标上棋子的叠加情况 
        {
            if(res[x][i]==a)//代表找到了需要移动的棋子 
            {
                flag=true;
                pos=i;//pos记录当前棋子的位置,便于后面移动棋子以后,把移动完的棋子从当前坐标删除 
            }
            if(flag)
            {
                m[res[x][i]]+=b;//移动棋子 
                res[m[a]].push_back(res[x][i]);//把棋子放到目标位置上 
            }
        }
        int y=res[x].size();
        for(int i=0;i<y-pos&&!res[x].empty();i++)//删除原来位置上移动完的棋子 
        {
            res[x].pop_back();
        }
    }else//跟上面同理 
    {
        bool flag=false;
        int x=m[a];
        int pos;
        for(int i=0;i<res[x].size();i++)
        {
            if(res[x][i]==a)
            {
                flag=true;
                pos=i;
            }
            if(flag)
            {
                
                m[res[x][i]]+=b;
                res[m[a]].push_back(res[x][i]);
            }
        }
        int y=res[x].size();
        for(int i=0;i<y-pos&&!res[x].empty();i++)
        {
            res[x].pop_back();
        }
    }
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        m[z]=2;m[l]=3;m[h]=4;//初始时棋子所在位置 
        res[2].push_back(1);res[3].push_back(2);res[4].push_back(3);//起初棋子所在位置 
        for(int i=0;i<12;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            solve(i,x,y);
        }
        for(int i=1;i<=9;i++)
        {
            res[i].clear();//每次需要把原有状态清空 
        }
        if(m[z]==9&&m[l]==9&&m[h]==9)
        {
            cout<<"Y"<<endl;
        }else
        {
            cout<<"N"<<endl;
        }
    }
    
    return 0;
}

G. 精灵宝可梦对战(模拟)

题目下面链接

https://codeforces.com/gym/104725/problem/G

AC代码

#include<bits/stdc++.h>
using namespace std;
const long long  N=1e7+10;
long long  n,m,k;
struct A
{
    int h,a,b,c,d,e,w,en;//en表示当前的能量值 
};
queue<A>q1,q2;//用来记录宝可梦 
long long  check1()//用来判断使用什么技能 
{
    long long  temp,num;
    if(max(0,q1.front().a-q2.front().c)>=max(0,q1.front().b-q2.front().d))//按题目模拟即可 
    {
        temp=max(0,q1.front().a-q2.front().c);
        num=1;//1表示使用物理攻击 
    }else
    {
        temp=max(0,q1.front().b-q2.front().d);
        num=2;//2表示使用魔法攻击 
    }
    if(q1.front().w>temp&&q1.front().en>=q1.front().e)
    {
        num=3;// 3表示使用真实伤害 
    }
    return num;
}
long long  check2()//同理上面 
{
    long long  temp,num;
    if(max(0,q2.front().a-q1.front().c)>=max(0,q2.front().b-q1.front().d))
    {
        temp=max(0,q2.front().a-q1.front().c);
        num=1;
    }else
    {
        temp=max(0,q2.front().b-q1.front().d);
        num=2;
    }
    if(q2.front().w>temp&&q2.front().en>=q2.front().e)
    {
        num=3;
    }
    return num;
}

int main()
{
    scanf("%lld%lld%lld",&n,&m,&k);
    long long  h,a,b,c,d,e,w;
    for(long long  i=0;i<n;i++)
    {
        scanf("%d%d%d%d%d%d%d",&h,&a,&b,&c,&d,&e,&w);
        q1.push({h,a,b,c,d,e,w,0});
    }
    for(long long  i=0;i<m;i++)
    {
        scanf("%d%d%d%d%d%d%d",&h,&a,&b,&c,&d,&e,&w);
        q2.push({h,a,b,c,d,e,w,0});
    }
    long long  op=1;long long  t;
    for(long long  i=0;i<k*2;i++)
    {
        if(op)//op=1表示当前是Alice在发动攻击 
        {
            t=check1();
        }else
        {
            t=check2();
        }
        if(q1.empty())
        {
            cout<<"Bob";
            return 0;
        }
        if(q2.empty())
        {
            cout<<"Alice";
            return 0;
        }
        if(t==1&&op)
        {
            q2.front().h-=max(0,q1.front().a-q2.front().c);//按照题目模拟即可 
            q1.front().en++;
        }else if(t==2&&op)
        {
            q2.front().h-=max(0,q1.front().b-q2.front().d);
            q1.front().en++;
        }else if(t==3&&op)
        {
            q2.front().h-=q1.front().w;
            q1.front().en-=q1.front().e;
        }else if(t==1)
        {
            q1.front().h-=max(0,q2.front().a-q1.front().c);
            q2.front().en++;
        }else if(t==2)
        {
            q1.front().h-=max(0,q2.front().b-q1.front().d);
            q2.front().en++;
        }else if(t==3)
        {
            q1.front().h-=q2.front().w;
            q2.front().en-=q2.front().e;
        }
        //归队
        if(op)
        {
            A k=q1.front();
            q1.pop();
            q1.push(k);
            if(q2.front().h<=0)q2.pop();//如果宝可梦死亡则出队 
            op=0;//每次处理完队伍情况后需要调换攻击顺序 
        }else
        {
            A k=q2.front();
            q2.pop();
            q2.push(k);
            if(q1.front().h<=0)q1.pop();
            op=1;
        }
    }
    cout<<"Draw";
    return 0;
}

K. RSP(签到)

题目链接

Problem - K - Codeforces

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    cout<<"1/"<<n;
}

L. 养成游戏(模拟+简单递归)

题目链接

Problem - L - Codeforces

AC代码

#include<bits/stdc++.h>
using namespace std;
const long long N=110;
long long n,m,k;
long long p[N];
long long  sum;
long long ma=0;
struct A
{
    long long i;long long j;long long op;long long a;long long b;long long d;long long v;
};
A res[N];
void dfs(long long u)
{
    if(u==n+1)
    {
        sum=0;
        for(long long i=0;i<m;i++)
        {
            if(res[i].op&&((res[i].a)*p[res[i].i]+res[i].b*p[res[i].j]>=res[i].d))
            {
                sum+=res[i].v;
            }else if(!res[i].op&&(res[i].a*p[res[i].i]+res[i].b*p[res[i].j]<=res[i].d))
            {
                sum+=res[i].v;
            }
        }
        ma=max(sum,ma);
        return ;
    }
    for(long long i=0;i<=k;i++)
    {
        p[u]=i;
        dfs(u+1);
    }
}
int main()
{
    cin>>n>>m>>k;
    for(long long q=0;q<m;q++)
    {
        long long i;long long j;long long op;long long a;long long b;long long d;long long v;
        cin>>i>>j>>op>>a>>b>>d>>v;
            res[q].i=i;res[q].j=j;res[q].op=op;res[q].a=a;res[q].b=b;res[q].d=d;res[q].v=v;
    }
    dfs(1);
    cout<<ma;
    return 0;
}

其他题目稍后更新quq~有任何问题可以评论区一起讨论quq

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值