其他分享
首页 > 其他分享> > 搭配飞行员

搭配飞行员

作者:互联网

前言:

日月如梭,光阴似箭。大家好,我盛艺承又回来了。今天给大家讲一下搭配飞行员这道题。

我们先来看题目

题目描述

飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员。由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭配驾驶员才能使出航的飞机最多。

因为驾驶工作分工严格,两个正驾驶员或两个副驾驶员都不能同机飞行。
 

输入

第一行,两个整数 n 与 m,表示共有  n 个飞行员,其中有 m 名飞行员是正驾驶员。
下面有若干行,每行有 2 个数字 a 、b。表示正驾驶员 a 和副驾驶员 b 可以同机飞行。
注:正驾驶员的编号在前,即正驾驶员的编号小于副驾驶员的编号。

输出

仅一行一个整数,表示最大起飞的飞机数。
 

样例输入

10 5
1 7
2 6
2 10
3 7
4 8
5 9

样例输出

4
这一题其实不难做。只需要2重循环就可以完成了。我连网络流都不用。而且居然不会TLE!直接大喊一声666。 好了,闲话不多说。我们讲一下思路。 思路: 这一题有一个陷阱。通过题目概述里的“若干个飞行员”可以确定——这一题的输入要用到EOF和While循环。至于怎么写,就不用我提及了吧。如果这还要我说,那你就关闭电脑好好看看学习吧。 要提醒的一点是——在输入的时候,要把输入的两个数用一个二维数组存起来。 为什么是一个二维数组呢?因为我们可以吧第一个维度用来标机飞行员,而第二个维度用来统计每个飞行员可配对的数量。因为数组的第0项我们用不到,所以可以直接拿来当统计飞行员配对的数量。 接下来用一个1~m的for循环。 再来一个1~f[i][0]的j循环。 在循环里面判断一下我们设定的标记是否为0。 因为如果为0的话,就表示这个飞行员没有被配对过。 当然,为了让每个都能匹配的飞行员都匹配上,也就是说不被别的飞行员抢了,我们需要定义一个mi变量,用来记录最少人匹配的飞行员。然后把j记下来。 mi也别忘了初始值。 之后,用一个if语句直接判断mi是否为初始值。 如果不是的话,就证明他已经有找到了。那么我们就让ans++。最后别忘了,还要把标记的数组设为1,表示被匹配过了。 下面是代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,a,b,f[101][101],i,j,mi,ans,vis[101],bj;
 4 int main(){
 5     cin>>n>>m;
 6     while(scanf("%d%d",&a,&b)!=EOF){//无线输入,一直到输入“Ctrl+z”。 
 7         f[a][++f[a][0]]=b;//标记一下a和b。
 8         f[b][++f[b][0]]=a;
 9     }
10     for(i=1;i<=m;i++){
11         mi=1e9;//mi的初值要为最大的数,1e9=100000000
12         for(j=1;j<=f[i][0];j++){//这里是到第i个飞行员匹配人数的总个数。 
13             if(vis[f[i][j]]==0){//如果没有被匹配过 
14                 if(f[f[i][j]][0]<=mi){//判断是否小于当前的最小值。 
15                     mi=f[i][j];//是的话,把mi设为这个当前的最小值。 
16                     bj=j;
17                 }
18             }
19         }
20         if(mi!=1e9){//判断是否有这个最小值 
21             vis[f[i][bj]]=1;//有的话,要把vis标记数组设为1,表示匹配过了。 
22             ans++;
23         }
24     }
25     cout<<ans;
26 }

以上就是此题的解法,感谢大家的观看。跪求三连。

标签:搭配,mi,副驾驶员,飞行员,这一题,输入,驾驶员
来源: https://www.cnblogs.com/Andysyc/p/15004784.html