挤奶顺序(分类讨论)

题目链接

题意:共n头牛,其中m头牛的顺序固定,k头牛的位置固定,求1号牛可以出现的最早位置

思路:分成三种情况,

①牛1位置固定,直接输出即可

②牛1属于顺序相对固定的队列,只需将m头牛从前向后见空插入

③牛1位置不固定,也不属于顺序固定的序列中,只需把m头牛从后向前见空插入,然后从前向后找第一个空位置插入牛1

#include <bits/stdc++.h>
using namespace std;
const int maxx = 1e5 + 10;
int sx[110], pos[110]; // sx表示顺序固定的几头牛的编号,pos[i]表示第i头牛放到pos[i]的位置
bool vis[110];         // vis[i]表示第i个位置有没有牛占用
int n, m, k;
int main()
{
    cin >> n >> m >> k;
    bool flag = false;
    for (int i = 1; i <= m; i++)
    {
        cin >> sx[i];
        if (sx[i] == 1)//牛1是否在顺序固定的序列中
            flag = true; //情况2
    }
    memset(pos, -1, sizeof(pos)); //初始成所有牛都不知位置
    //pos[0]=0,pos[n+1]=n+1;
    for (int i = 1; i <= k; i++)
    {
        int a, b;
        cin >> a >> b;
        if (a == 1) //情况1 牛1位置固定
        {
            cout << b << endl;
            return 0;
        }
        else
        {
            pos[a] = b;
            vis[b] = true;//这个位置被占
        }
    }
    if (flag) //情况2 牛1在顺序固定的序列中
    {
        for (int i = 1, j = 1; i <= m; i++) //从前向后紧挨着放m头牛,放置位置j
        {                                   //用j表示从位置1往后找,牛sx[i]能放到的最靠前的位置
            while (vis[j])
                j++; //位置被占用了就看下一个位置
            if (pos[sx[i]] != -1)
                j = pos[sx[i]]+1; //第sx[i]头牛的位置是固定的 j就跳到固定位置的后一个位置
            else
            {
                if (sx[i] == 1)
                {
                    cout << j << endl;//j就是当前最靠前的位置
                    return 0;
                }
                else
                {
                    vis[j] = true;//牛sx[i]放到j上
                    j++;
                }
            }
        }
    }
    else //情况3
    {
        for (int i = m, j = n; i; i--)//从后向前放m头牛
        {                             //用j表示从位置n往前找,牛sx[i]能放到的最靠后的位置
            while (vis[j])
                j--; //位置被占用了
            if (pos[sx[i]] != -1) //第sx[i]头牛的位置是固定的 j就跳到固定位置的前一个位置
                j = pos[sx[i]]-1;
            else
            {
                vis[j] = true;
                j--;
            }
        }
        for (int i = 1; i <= n; i++)//从前向后找第一个空位置放牛1
        {
            if (!vis[i])
            {
                cout << i << endl;
                return 0;
            }
        }
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值