
Codeforces Round #762 (Div. 3) D题 New Year's Problem题解
题目
1.题目大意
- m 个商店, n 个朋友
- 每个礼物对应一个快乐值 a
- 只能从 n-1 个商店里买 n 个礼物
- 第 j 个朋友的礼物只能从每个商店的第 j 个礼物中产生
- 目标:最后得到的所有 a 之中的最小值达到最大
2.题目分析
- 求最大的最小值 ==> 用二分
- 思路:根据快乐值的范围,对其进行二分,查找符合题意的最小值。
- 符合题意的标准:根据抽屉原理,只要有一个商店可以满足2个朋友,剩下的商店中只要可以让剩下的朋友都拿到礼物就算满足当前的快乐值。
3.题目代码
#include <iostream>
#include <mem.h>
#define MAX 1e9
using namespace std;
int main()
{
int t;
cin >> t;
int m, n;
while(t--)
{
cin >> m >> n;
int a[m][n];//商店礼品的快乐值
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin >> a[i][j];
int l=0, r=MAX+5;
int ans = 0;
while(l<=r)
{
int mid = (l + r) / 2;
bool flag = false;//当前是否符合题意
bool f[n];//朋友是否有礼物
memset(f,false,sizeof(f));
for(int i=0;i<m;i++)//是否存在满足2个朋友的商店
{
int cnt = 0;
for(int j=0;j<n;j++)
{
if(a[i][j]>=mid)
{
cnt++;
f[j] = true;
}
}
if(cnt>=2)
flag = true;
}
if(flag)//是否所有朋友都有礼物
for(int i=0;i<n;i++)
{
if(!f[i])
{
flag = false;
break;
}
}
if(flag)
{
ans = mid;
l = mid + 1;
}
else
r = mid - 1;
}
cout << ans << endl;
}
return 0;
}