题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1305
思路:
贪心:由于两个人的喜欢是双向的,所以一个男孩在跟他喜欢的女孩跳舞时,该女孩也不需要消耗与不喜欢男孩跳舞的次数k,所以如果每个人都只能跟喜欢的人跳舞,那么可以播放的舞曲数目就是所有人各自喜欢的人人数的最小值。然后,现在每个人有可以跟k个不喜欢的人跳舞,那么,每个人最多可以跳舞的数目就是min(喜欢的人数+k,n)(他只能跟每个人跳一次舞,所以最多跳舞数不会超过n)。那么,播放最多的舞曲数就是所有人最多可以跳舞数的最小值。
网络流:暴力去枚举就好了。。。就不多说了
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
using namespace std;
#define MAXN 51
int girl[MAXN],boy[MAXN];
int n,k;
char c[MAXN];
int ans=0x7fffffff;
int main(){
memset(girl,0,sizeof(girl));
memset(boy,0,sizeof(boy));
scanf("%d%d",&n,&k);
for (int i=0;i++<n;){
scanf("%s",&c);
for (int j=0;j<n;j++){
if (c[j]=='Y'){
boy[i]++;
girl[j+1]++;
}
}
}
for (int i=0;i++<n;){
ans=min(ans,girl[i]);
ans=min(ans,boy[i]);
}
ans+=k;
ans=min(ans,n);
printf("%d\n",ans);
return 0;
}