1 条题解
-
0
题意简述
有 头奶牛需要挤奶,并且有 头奶牛产生了阶级,阶级高的奶牛必须比阶级低的奶牛先挤奶,有 头奶牛只允许她们在一个特定的位置挤奶,让你求第 头奶牛最早可以在第几个挤奶。
解题思路
若要使第 头奶牛更早地挤奶,应当考虑以下两种情况。
- 奶牛 在阶级中,那么只要把比他阶级高的奶牛尽量往前放,就能使奶牛 更早的挤奶。
- 奶牛 不在阶级中,那么只要把有阶级的奶牛尽量往后放,就能使奶牛 更早的挤奶。
代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll N = 105; ll a[N], n, m, k, b[N], c[N], vis[N];//vis[i]表示被安排在第i个位置的奶牛编号 bool flag; ll find(ll x){//找到奶牛x在第几个挤奶 for(int i = 1; i <= n; i++){ if(vis[i] == x){ return i; } } return -1; } int main(){ cin >> n >> m >> k; for(int i = 1; i <= m; i++){ cin >> a[i]; if(a[i] == 1){//证明奶牛1在阶级中 flag = 1; } } for(int i = 1; i <= k; i++){ cin >> b[i] >> c[i]; vis[c[i]] = b[i]; } ll tmp = 1; if(flag){//第一种情况 for(int i = 1; i <= n;){ if(find(a[tmp]) != -1){ i = find(a[tmp]) + 1;//阶级高的奶牛往前放 tmp++; continue; } if(!vis[i]){ vis[i] = a[tmp]; if(a[tmp] == 1){ cout << i; break; } tmp++; } i++; } }else{//第二种情况 for(int i = 1; i <= m; i++){ ll wz = find(a[i]), tmp = i; if(wz != -1){ for(int j = wz - 1; j >= 1 && tmp != 1; j--){ if(!vis[j] && find(a[tmp - 1]) == -1){ vis[j] = a[--tmp];//有阶级的奶牛往后放 } } } } for(int i = 1; i <= n; i++){//因为阶级已经处理完了,所以没有被安排的最早位置就是奶牛1的最早挤奶位置 if(!vis[i]){ cout << i; break; } } } return 0; }
- 1
信息
- ID
- 6788
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 540
- 已通过
- 7
- 上传者