非诚勿扰 贪心

贪心策略:
分成两组求解:
男生要求女生比它工资低时。。。
用高工资男生把
先把高工资的女生匹配掉

男生要求女生比他高时。。
用女生高工资匹配高工资男生的。 

View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
using namespace std;

vector<int>girl[2];
vector<int>boy[2];
int M = 0;

/*
 贪心策略:
  
 男生要求女生比它工资低时。。。
  用高工资男生把 
 先把高工资的女生匹配掉 
 
 男生要求女生比他高时。。
 用女生高工资匹配高工资男生的。 
  
*/
 
void match(vector<int> &boy, vector<int> &girl) //boy,girl 
{  
   if( boy.empty( ) || girl.empty() )
       return; 
   for( int i = boy.size()-1, j = girl.size()-1; i >= 0&& j >= 0; i--, j--,M++)
   {
      while( boy[i] <= girl[j] )
      {
           j--;
           if( j < 0 )
               return ;
      }
      if( j < 0 )
          return;

   }     
}

int main( )
{
  int T, N, v;
  scanf("%d",&T);
  while(T--)
  {
    scanf("%d",&N);
    for( int i = 0; i <= 1; i++)
    {
       girl[i].clear( );
       boy[i].clear( );     
    }
    M = 0;
    for( int i = 1; i <= N; i++)
    {
       scanf("%d",&v);
       if( v > 0 )
           boy[1].push_back( v );
       else
           boy[0].push_back( -v );
    }          
    for( int i = 1; i <= N; i++)
    {
       scanf("%d",&v);     
       if( v > 0 )
           girl[1].push_back( v );
       else
           girl[0].push_back( -v );
    }
    for( int i = 0; i <= 1; i++)
    {
     sort(boy[i].begin( ), boy[i].end());
     sort(girl[i].begin(), girl[i].end());
    }
    match(boy[0],girl[1]); 
    match(girl[0],boy[1]);
    printf("%d\n",M);
  }  
  return 0;
}

posted on 2012-07-30 16:29  more think, more gains  阅读(156)  评论(0编辑  收藏  举报

导航