非诚勿扰 贪心
贪心策略:
分成两组求解:
男生要求女生比它工资低时。。。
用高工资男生把
先把高工资的女生匹配掉
男生要求女生比他高时。。
用女生高工资匹配高工资男生的。
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) 编辑 收藏 举报