| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 4675 | Accepted: 1957 |
Description
Input
Output
Sample Input
2 4 35 M classicism programming 0 M baroque skiing 43 M baroque chess 30 F baroque soccer 8 27 M romance programming 194 F baroque programming 67 M baroque ping-pong 51 M classicism programming 80 M classicism Paintball 35 M baroque ping-pong 39 F romance ping-pong 110 M romance Paintball
Sample Output
3 7
Source
//1500K 1172MS
#include<stdio.h>
#include<string.h>
#include<math.h>
#define M 507
int link[M],g[M][M];
bool vis[M];
int n;
struct ST
{
int height;
char sex[2],music[107],sport[107];
}pupils[M];
bool judge(int x,int y)
{
if(fabs(pupils[x].height-pupils[y].height)>40||strcmp(pupils[x].sex,pupils[y].sex)==0||strcmp(pupils[x].music,pupils[y].music)!=0||strcmp(pupils[x].sport,pupils[y].sport)==0)
return false;
return true;
}
bool find(int i)
{
for(int j=1;j<=n;j++)
if(!vis[j]&&g[i][j])
{
vis[j]=true;
if(!link[j]||find(link[j]))
{
link[j]=i;
return true;
}
}
return false;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(link,0,sizeof(link));
memset(g,0,sizeof(g));
int count=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%s%s%s",&pupils[i].height,pupils[i].sex,pupils[i].music,pupils[i].sport);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(judge(i,j))g[i][j]=1;
for(int i=1;i<=n;i++)
{
memset(vis,false,sizeof(vis));
if(find(i))count++;
}
printf("%d\n",n-count/2);
}
return 0;
}
原文:http://blog.csdn.net/voipmaker/article/details/19682763