分类讨论
2022/2/9 6:43:29
本文主要是介绍分类讨论,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
https://www.acwing.com/video/3702/ (while和vis数组结合 自增找空位置指针)
已知各个牛相对顺序和绝对顺序,求牛1的位置
分类三种情况
情况1:已知牛1的绝对位置 直接输出
情况2:已知牛1的相对位置 那么先放相对位置在牛1前面的牛 再放牛1
情况3:不知道的牛的位置
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 110; int n, m, k; int q[N]; int p[N];//记录位置,下标是牛,值是位置 bool st[N]; int main() { cin >> n >> m >> k; bool flag = false; for (int i = 1; i <= m; i ++ ) { cin >> q[i];//记录相对位置 if (q[i] == 1) flag = true;//发现了牛1 标记为情况2 } memset(p, -1, sizeof p);//需要清空所有牛的位置 for (int i = 0; i < k; i ++ )//放绝对位置 { int a, b; cin >> a >> b; if (a == 1)//第一种情况 { cout << b << endl; return 0; } p[a] = b;// st[b] = true;//记录该位置已经有人了 } if (flag)//情况2 { for (int i = 1, j = 1; i <= m; i ++ )//m是相对牛的数量 { while (st[j]) j ++ ;//找空位,j是一直是空位置指针 if (p[q[i]] != -1) j = p[q[i]];//如果相对牛的位置确定下来(说明还是绝对牛)且这个牛不是牛1,说明牛1还在后面,j从这个位置开始,i取下一个相对牛 else { if (q[i] == 1) { //如果这个相对牛是牛一,直接输出这个空位置 cout << j << endl; return 0; } st[j] = true;//不是牛1,又没确定下来,就把这个位置设置为真 j ++ ; } } } else { for (int i = m, j = n; i; i -- )//先把绝对牛有多少是多少全部放到后面 那么第一个空位置就是牛1了 { while (st[j]) j -- ;//j是一直空位置指针 if (p[q[i]] != -1) j = p[q[i]];//这个相对牛确定下来 就从这个绝对牛开始 else { st[j] = true;//相对牛没有确定下来,就往前找一个空位置 j -- ; } } for (int i = 1; i <= n; i ++ ) if (!st[i])//发现的第一个空指针牛就是所求 { cout << i << endl; return 0; } } return 0;
这篇关于分类讨论的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南