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;
}

posted @   仪战群儒  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示