前言:
日月如梭,光阴似箭。大家好,我盛艺承又回来了。今天给大家讲一下搭配飞行员这道题。
我们先来看题目
这一题其实不难做。只需要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 }
以上就是此题的解法,感谢大家的观看。跪求三连。