寒假每日一题——挤奶顺序
挤奶顺序
问题描述
Farmer John 有 N 头奶牛,编号为 1…N。
他每天都要给他的奶牛们挤奶。
奶牛的社会结构非常复杂,其结构有两个关键特性。
首先,有 M 头奶牛的地位等级分明,按照地位越高越早挤奶的规则,这些奶牛的相对挤奶顺序是固定的。
此外,有 K 头奶牛的具体挤奶顺序也是固定的,比如,奶牛 4 必须在所有奶牛中的第二位挤奶。
幸运的是,Farmer John 总是能够以一种满足所有这些情况的顺序给他的奶牛们挤奶。
不幸的是,奶牛 1 最近生病了,所以 Farmer John 想要尽早给这头奶牛挤奶,使得她可以回到牛棚休息。
请帮助 Farmer John 求出奶牛 1 可以在挤奶顺序中出现的最早位置。
输入格式
第一行包含 N,M,K,表示 Farmer John 有 N 头奶牛,其中 M 头形成了社会阶层,K 头需要在挤奶顺序中处于一个特定的位置。
下一行包含 M 个不同的整数 mi。在这一行出现的奶牛必须以与她们在这行出现的顺序相同的顺序进行挤奶。
下面 K 行,每行包含两个整数 ci 和 pi,表示奶牛 ci 一定要在第 pi 位进行挤奶。
输入数据保证:在这些限制之下,Farmer John 能够建立一个符合要求的挤奶顺序。
输出格式
输出奶牛 1 可以在挤奶顺序中出现的最早位置。
数据范围
2≤N≤100,
1≤M,K<N,
1≤mi,ci,pi≤N
输入样例:
6 3 2
4 5 6
5 3
3 1
输出样例:
4
样例解释
在这个例子中,Farmer John 有六头奶牛,其中奶牛 1 生病了。
他的挤奶顺序应该为奶牛 4 在奶牛 5 之前,奶牛 5 在奶牛 6 之前。
此外,Farmer John 必须要第一个给奶牛 3 挤奶,第三个给奶牛 5 挤奶。
FJ必须第一个给奶牛 3 挤奶,由于奶牛 4 必须要在奶牛 5 之前,奶牛 4 一定是第二个挤奶的,然后奶牛 5 第三个。
于是,奶牛 1 最早在挤奶顺序中出现的位置是第四个。
思路分析

完整代码
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int M[N];
vector<int> res(N);
int n, m, k;
int main()
{
cin >> n >> m >> k;
int flag = 0;//0为 阶级中没有1 1为阶级中有1
for(int i = 1; i <= m; i++)
{
cin >> M[i];
if(M[i] == 1) flag = 1;
}
int c, p;
while(k--)
{
cin >> c >> p;
res[p] = c;
if(c == 1)
{
cout << p;
return 0;
}
}
if(flag == 0)// 阶级中没有1 从后往前安排
{
for(int i = m, j = n; i >= 1; i--)
{
int t = find(res.begin(), res.end(), M[i]) - res.begin();
if(t == res.end() - res.begin())
{
while(res[j] != 0) j--;
res[j] = M[i];
}
else j = t - 1;
}
for(int i = 1; i <= n; i++)
{
if(res[i] == 0)
{
cout << i;
return 0;
}
}
}
else//阶级中有1 从前往后安排
{
for(int i = 1, j = 1; i <= m; i++)
{
int t = find(res.begin(), res.end(), M[i]) - res.begin();
if(t == res.end() - res.begin())// 该牛没有固定位置
{
while(res[j] != 0) j++;
if(M[i] == 1)
{
cout << j;
return 0;
}
else res[j] = M[i];
}
else j = t + 1;
}
}
return 0;
}

浙公网安备 33010602011771号