2021牛客暑期多校训练营2

126 篇文章 0 订阅
32 篇文章 0 订阅


C–Draw Grids

题目链接:


题意:
总共有 n ∗ m n*m nm 个点, 两人轮流选取两个点连一条线, 不能连已经连过的线, 并且连成的图形不能形成闭合回路, 两人都选取最优策略,最后不能操作的人输


题解:

判断奇偶性就好

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    int ans=n*m-1;
    if(ans%2) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}

D–Er Ba Game

题目链接:


题意:

给定四个数 a 1 a1 a1, b 1 b1 b1, a 2 a2 a2, b 2 b2 b2 按照以下规定比较
在这里插入图片描述
输出谁赢


题解:

简单的模拟, 按照规则模拟就好了

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int a,b,c,d;
        cin>>a>>b>>c>>d;
        if(a>b) swap(a,b);
        if(c>d) swap(d,c);
        if(a==2&&b==8)
        {
            if(c==2&&d==8) cout<<"tie"<<endl;
            else cout<<"first"<<endl;
        }
        else if(c==2&&d==8)
        {
            if(a==2&&b==8) cout<<"tie"<<endl;
            else cout<<"second"<<endl;
        }
        else if(a==b&&c!=d) cout<<"first"<<endl;
        else if(c==d&&a!=b) cout<<"second"<<endl;
        else if(a==b&&c==d) 
        {
            if(a>c) cout<<"first"<<endl;
            else if(a<c) cout<<"second"<<endl;
            else cout<<"tie"<<endl;
        }
        else if((a+b)%10>(c+d)%10) cout<<"first"<<endl;
        else if((a+b)%10<(c+d)%10) cout<<"second"<<endl;
        else if((a+b)%10==(c+d)%10)
        {
            if(b>d) cout<<"first"<<endl;
            else if(d>b) cout<<"second"<<endl;
            else cout<<"tie"<<endl;
        }
    }
    return 0;
}

K–Stack

题目链接:


题意:

题中代码为求单调递增序列, 并用 b b b 数组储存当前栈里有几个数字 (当前有几个数字递增) , 给定 k k k b b b 数组的信息, 求原序列( n n n 排列)


题解:

我们可以先把 b b b 数组填完

例如

在这里插入图片描述
对于没填过的地方, 我们可以按照递增处理
如果发现 b [ j ] − b [ i ] > j − i b[j]-b[i] > j - i b[j]b[i]>ji, 说明递增的数字增加幅度大于最大能增加的数字, 则说明不满足,输出 − 1 -1 1
填完 b b b 数组以后, 我们按照 b b b 数组来填写 a a a数组(原序列), 因为对于每一个 b [ i ] b[i] b[i], 可以确定 i i i 以前的排列状态, 所以需要从后面开始确定 a a a 数组

在这里插入图片描述

每次模拟都找到队头元素

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N],b[N];
stack<int> q;
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=k;i++)
    {
        int x,y;
        cin>>x>>y;
        b[x]=y;
    }
    for(int i=1;i<=n;i++)
    {
        if(!b[i]) b[i]=b[i-1]+1;
        if(b[i]-b[i-1]>1)
        {
            cout<<-1<<endl;
            return 0;
        }
    }
    int con=0;
    for(int i=n;i>=1;i--)
    {
        while(b[i]>q.size()) q.push(++con);
        a[i]=q.top();
        q.pop();
    }
    for(int i=1;i<=n;i++)
    {
        cout<<a[i]<<" ";
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值