链接:https://www.nowcoder.com/acm/contest/212/B
来源:牛客网

题目描述

有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏....
Misaka和Kuroko在一个 n x m 的棋盘上玩游戏,每个格子上都放着一些呱太。游戏共进行 k 回合,每一回合 Kuroko会选**有呱太**的一行 i,在这之后Misaka会选择一列 j ,并拿走格子 (i, j) 上的所有呱太,Misaka希望自己拿走的呱太尽可能多,而Kuroko不想让Misaka拿走很多呱太,所以她希望拿走的呱太尽可能少。
在一旁围观的恒温死神希望预测结果,请你预测在双方都采取最优策略的情况下,Misaka最终能拿走呱太的数量。

输入描述:

第一行三个数 n, m, k。
接下来 n 行,每行 m 个数,第 i 行第 j 个数表示棋盘第 i 行第 j 列上的呱太数量 ai,j。

输出描述:

输出共一个数,表示在你的预测下,Misaka最终能拿走呱太的数量。

输入

3 2 4
5 7
3 2
8 5

输出

17

将矩阵的每一行从大到小排序

这样问题就变成了:每一行都选择一段前缀, 可以不选,求出总共选了刚好k个数的最小值

可以证明:最优情况下一定是最多只能有一行只选一部分,剩下n-1行要不整行全选,要不不选

也就是说对于当前k,暴力枚举哪一行选择前(k%m)个,然后剩下n-1行中选择所有和最小的(k/m)行就可以了

复杂度O(nlogm+n²)

证明如下:

假设第1行选择了前x个数字, 第2行选择了前y个数字,且x, y<m(都没选满一行)

那么可以得出a[2][y+1]>a[1][x] → a[2][y]>a[1][x] → a[2][y]>a[1][x+1],这样的话如果第二行选择前y-1个数字,第一行选择前x+1个一定更优, 证毕

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define LL long long
#define mod 1000000007
LL jz[1005][1005];
int a[1005][1005];
typedef struct Res
{int id;LL sum;bool operator < (const Res &b) const{if(sum<b.sum)return 1;return 0;}
}Res;
Res s[200005];
int comp(int x, int y)  {  return x>y;  };
int main(void)
{LL ans, now;int n, m, k, i, j, cnt;scanf("%d%d%d", &n, &m, &k);for(i=1;i<=n;i++){for(j=1;j<=m;j++)scanf("%d", &a[i][j]);sort(a[i]+1, a[i]+m+1, comp);}ans = 0;for(i=1;i<=n;i++){for(j=1;j<=m;j++)jz[i][j] = jz[i][j-1]+a[i][j];ans += jz[i][m];s[i].sum = jz[i][m], s[i].id = i;}sort(s+1, s+n+1);for(i=1;i<=n;i++){cnt = 0;now = jz[i][k%m];for(j=1;j<=n;j++){if(cnt==k/m)break;if(s[j].id==i && k%m)continue;now += s[j].sum;++cnt;}ans = min(ans, now);}printf("%lld\n", ans);return 0;
}
/*
2 3 1
7 6 5
10 1 1
*/

Wannafly挑战赛26: B. 冥土追魂(思维题)相关推荐

  1. nowcoder (牛客)Wannafly挑战赛26 B: 冥土追魂 (思维)

    链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言104 ...

  2. wannafly挑战赛26 B 冥土追魂 (思维+排序)

    大致题意 有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏- Misaka和Kuroko在一个 n x m 的棋盘上玩游戏,每个格子上都放着一些呱太.游戏共进行 k 回合,每一回合 ...

  3. Wannafly挑战赛26 B.冥土追魂 贪心

    链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 题目描述 有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏.... Misa ...

  4. Wannafly挑战赛26 B 冥土追魂(暴力)

    题意:链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏.... Misaka ...

  5. Wannafly挑战赛26 B冥土追魂

    链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言104 ...

  6. Wannafly挑战赛26 B 冥土追魂

    首先,证明结果一定是取某些整行,再加上一个多余的一行的前几个. 假如: x1<=x2<=x3<=x4<=x5 y1<=y2<=y3<=y4<=y5 取6 ...

  7. Wannafly挑战赛26-B 冥土追魂

    地址:https://www.nowcoder.com/acm/contest/212/B 思路:对于行列选取,是选择所有行中的最大值的最小值,当是并不能用贪心来做,例如 2 2 2 7 8 1 9 ...

  8. Wannafly挑战赛26 题解

    Wannafly挑战赛26 题目连接 https://www.nowcoder.com/acm/contest/212#question A. 御坂网络 枚举圆心所在的位置, O ( n ) O(n) ...

  9. Wannafly挑战赛26:B冥土追魂(模拟?贪心?暴力?)

    题目描述 有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏.... Misaka和Kuroko在一个 n x m 的棋盘上玩游戏,每个格子上都放着一些呱太.游戏共进行 k 回合,每一 ...

最新文章

  1. (转)命令行下,用 xcodebuild 生成ipa文件,通过 itms-services 协议安装
  2. Fiddler小技巧-测试上传文件接口多参数并传情况
  3. libtorch 权重封装
  4. 牛客小白月赛2 D 虚虚实实 【欧拉图】【连通图】
  5. python第三天习题
  6. 正确使用和理解C#中的闭包
  7. @keyframes中translate和scale混用问题
  8. C++primer拾遗(第八章:IO库)
  9. java mail 已发送_JavaMail获取已发送邮件
  10. spark 序列化_spark shell 配置 Kryo 序列化
  11. django之Form表单
  12. 用python分析拼多多_利用Python分析拼多多上卖的最热的产品, 结果出乎大多数人意料!...
  13. 高等数学(工本)选择题
  14. DELL服务器常见报错信息
  15. webpack3基础总结
  16. 如何用计算机计算微积分,高数从此不用怕?一键计算微积分的神App
  17. 教室多媒体计算机主频,多媒体教室配置和列表.doc
  18. 关于编译错误ambiguous call of overridden pre R14 auto-imported BIF get/1
  19. [CF 417D]Cunning Gena:状压DP
  20. 牛客 华华听月月唱歌 贪心

热门文章

  1. 【PHP基础】Cookie基础知识、应用案例代码及攻防
  2. java自适应响应式 企业网站源码 SSM 生成静态化 手机 平板 PC
  3. 谷歌浏览器默认开启无痕浏览
  4. 有2个学生,每个学生有3门课程的成绩,从键盘中输入学生数据(包括学号,姓名 3门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中
  5. 传感器测试--声音采集与FFT 分析
  6. linux修改文件夹磁盘,linux下修改磁盘卷标
  7. linux修改磁盘标签,Ubuntu挂载硬盘,修改卷标
  8. 小姜腚腚雯雯小敏的爱情故事
  9. Liunx(2) 发送邮件通知
  10. struts logic:iterate标签用法