OR137. 舞会
描述
今天,在冬木市举行了一场盛大的舞会。参加舞会的有n 位男士,从 1 到 n 编号;有 m 位女士,从 1 到 m 编号。对于每一位男士,他们心中都有各自心仪的一些女士,在这次舞会中,他们希望能与每一位自己心仪的女士跳一次舞。同样的,对于每一位女士,她们心中也有各自心仪的一些男士,她们也希望能与每一位自己心仪的男士跳一次舞。在舞会中,对于每一首舞曲,你可以选择一些男士和女士出来跳舞。但是显然的,一首舞曲中一位男士只能和一位女士跳舞,一位女士也只能和一位男士跳舞。由于舞会的时间有限,现在你想知道你最少需要准备多少首舞曲,才能使所有人的心愿都得到满足?
输入描述
第一行包含两个整数n,m,表示男士和女士的人数。1≤n,m≤ 1000输出描述
一个整数,表示最少需要准备的舞曲数目。示例1
输入:
2 3 1 1 2 2 3 0 0 0
输出:
2
示例2
输入:
3 3 2 1 2 2 1 3 2 2 3 1 1 2 1 3 2 2 3
输出:
2
说明:
对于样例2,我们只需要两首舞曲,第一首舞曲安排(1,1),(2,3),(3,2);第二首舞曲安排(1,2),(2,1),(3,3)。C 解法, 执行用时: 1ms, 内存消耗: 228KB, 提交时间: 2019-05-09
#include<stdio.h> #include<malloc.h> int main() { short n=0; short m=0; scanf("%hd%hd",&n,&m); int len=n*m; char* nLikes=calloc(len,sizeof(char)); char* mLikes=calloc(len,sizeof(char)); for(short i=0; i<n; i++) { short likeCount; scanf("%hd",&likeCount); for(short j=0; j<likeCount; j++) { short mNo; scanf("%hd",&mNo); nLikes[i*m+mNo-1]=1; mLikes[(mNo-1)*n+i]=1; } } for(short i=0; i<m; i++) { short likeCount; scanf("%hd",&likeCount); for(short j=0; j<likeCount; j++) { short nNo; scanf("%hd",&nNo); mLikes[i*n+nNo-1]=1; nLikes[(nNo-1)*m+i]=1; } } short danceCount=0; for(short i=0; i<n; i++) { short count=0; for(short j=0; j<m; j++) { if(nLikes[i*m+j]) { count++; } } if(count>danceCount) { danceCount=count; } } for(short i=0; i<m; i++) { short count=0; for(short j=0; j<n; j++) { if(mLikes[i*n+j]) { count++; } } if(count>danceCount) { danceCount=count; } } printf("%hd\n",danceCount); free(nLikes); free(mLikes); return 0; }
C 解法, 执行用时: 1ms, 内存消耗: 232KB, 提交时间: 2019-11-06
#include<stdio.h> #include<malloc.h> int main() { short n=0; short m=0; scanf("%hd%hd",&n,&m); int lenth=n*m; char* mLove=calloc(lenth,sizeof(char)); char* wLove=calloc(lenth,sizeof(char)); for(short i=0; i<n; i++) { short loveCount; scanf("%hd",&loveCount); for(short j=0; j<loveCount; j++) { short mNo; scanf("%hd",&mNo); mLove[i*m+mNo-1]=1; wLove[(mNo-1)*n+i]=1; } } for(short i=0; i<m; i++) { short loveCount; scanf("%hd",&loveCount); for(short j=0; j<loveCount; j++) { short nNo; scanf("%hd",&nNo); wLove[i*n+nNo-1]=1; mLove[(nNo-1)*m+i]=1; } } short danceCount=0; for(short i=0; i<n; i++) { short count=0; for(short j=0; j<m; j++) { if(mLove[i*m+j]) { count++; } } if(count>danceCount) { danceCount=count; } } for(short i=0; i<m; i++) { short count=0; for(short j=0; j<n; j++) { if(wLove[i*n+j]) { count++; } } if(count>danceCount) { danceCount=count; } } printf("%hd\n",danceCount); free(mLove); free(wLove); return 0; }