模拟~~~

重演到第7场啦~撒花~

这是一道简单的模拟题,但是要稍微想一下循环的顺序~~

给出男生的编号和女生的编号(编号可以重复)

两两配对的条件需要满足abs(a[i]-b[i])<=1;

也就是最大相差不能超过1;

如果不排序的话,模拟的步骤就是两个循环:

for(int i=0;i<n;i++)

  for(int j=0;j<m;j++){.....}

ans=max{ans,num}

但是这样显然是!不可取的!

要先将男生和女生分别排序,由于他们的匹配条件

比如说

男生是:3 6 8

女生是:5 9 20

先让3和5配对,如果不行的话,继续往下,3再和9,20配对,也不行

发现无法配对

则6开始配对,6和5可以配对,下一次开始配对的时候,就从9开始,不用再往回看了

因为对于8来说,它是不可能与小于5的数再进行配对了,因为它是大于6的

6可以,那么8就不可以了

举了一个不太好的例子

上代码吧

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[105], b[105],ans,pos;
 4 int main(){
 5     int n, m;
 6     cin >> n; 7     for (int i = 0; i < n;i++)
 8         cin >> a[i];
      cin>>m;
9 for (int i = 0; i < m;i++) 10 cin >> b[i]; 11 sort(a, a + n); 12 sort(b, b + m); 13 for (int i = 0; i < n;i++){ 14 for (int j = pos; j < m;j++){ 15 if(a[i]-b[j]<=1&&a[i]-b[j]>=-1){ 16 ans++; 17 pos = j + 1; 18 break; 19 } 20 } 21 } 22 cout << ans; 23 return 0; 24 }

这里唯一的点就是pos=j+1;j=pos这个地方,前面匹配过的,后面就不用再看了

猜你喜欢

转载自www.cnblogs.com/guaguastandup/p/10425872.html
今日推荐