CF1619D.New Year‘s Problem

CF1619D.New Year’s Problem

  • 贪心

  • 因为只能取到n-1个商店,因此当n-1 > m时一定会有两人在同一家商店买礼物

    • 枚举哪一家商店,哪两个人买礼物,再与最优时候(不管n-1)的最小值取小
    • 代码附注释如下
  •   #include<bits/stdc++.h>
      
      using namespace std;
      const int N = 100010;
      int T,n,m;
      
      int main()
      {
          cin>>T;
          while(T --)
          {
              cin>>m>>n;
              //mins为所有礼物最大满意度的最小值
              int ans = 0,min_s = INT_MAX;
              //存礼物的满意度
              vector<vector<int>> p(m,vector<int>(n));
              //存每种礼物的最大满意度
              vector<int> max_s(n);
              
              for(int i=0;i<m;i++)
                  for(int j=0;j<n;j++)
                  {
                      int x;
                      cin>>x;
                      //同种礼物取最大
                      max_s[j] = max(max_s[j],x);
                      p[i][j] = x;
                  }
                  
              //所有种礼物的最大心意中的最小
              for(int i=0;i<n;i++)
                  min_s = min(min_s,max_s[i]);
              
              //说明想在哪买在哪买,直接就是min_s为答案
              if(n - 1 >= m) 
                  ans = min_s;
              else
              {
                  //枚举商店
                  for(int k=0;k<m;k++)
                      //双指针枚举两个人
                      for(int i=0;i<n;i++)
                          for(int j=i+1;j<n;j++)
                              //ans为最大的结果
                              //当前商店买这两种礼物与之前最小再取最小为当前情况结果
                              ans = max(ans,min({min_s,p[k][i],p[k][j]}));
              }
              cout<<ans<<endl;
          }
          return 0;
      }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光男孩01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值