题意:共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;
}