Wannafly挑战赛26: B. 冥土追魂(思维题)
链接: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. 冥土追魂(思维题)相关推荐
- nowcoder (牛客)Wannafly挑战赛26 B: 冥土追魂 (思维)
链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言104 ...
- wannafly挑战赛26 B 冥土追魂 (思维+排序)
大致题意 有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏- Misaka和Kuroko在一个 n x m 的棋盘上玩游戏,每个格子上都放着一些呱太.游戏共进行 k 回合,每一回合 ...
- Wannafly挑战赛26 B.冥土追魂 贪心
链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 题目描述 有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏.... Misa ...
- Wannafly挑战赛26 B 冥土追魂(暴力)
题意:链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏.... Misaka ...
- Wannafly挑战赛26 B冥土追魂
链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言104 ...
- Wannafly挑战赛26 B 冥土追魂
首先,证明结果一定是取某些整行,再加上一个多余的一行的前几个. 假如: x1<=x2<=x3<=x4<=x5 y1<=y2<=y3<=y4<=y5 取6 ...
- Wannafly挑战赛26-B 冥土追魂
地址:https://www.nowcoder.com/acm/contest/212/B 思路:对于行列选取,是选择所有行中的最大值的最小值,当是并不能用贪心来做,例如 2 2 2 7 8 1 9 ...
- Wannafly挑战赛26 题解
Wannafly挑战赛26 题目连接 https://www.nowcoder.com/acm/contest/212#question A. 御坂网络 枚举圆心所在的位置, O ( n ) O(n) ...
- Wannafly挑战赛26:B冥土追魂(模拟?贪心?暴力?)
题目描述 有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏.... Misaka和Kuroko在一个 n x m 的棋盘上玩游戏,每个格子上都放着一些呱太.游戏共进行 k 回合,每一 ...
最新文章
- (转)命令行下,用 xcodebuild 生成ipa文件,通过 itms-services 协议安装
- Fiddler小技巧-测试上传文件接口多参数并传情况
- libtorch 权重封装
- 牛客小白月赛2 D 虚虚实实 【欧拉图】【连通图】
- python第三天习题
- 正确使用和理解C#中的闭包
- @keyframes中translate和scale混用问题
- C++primer拾遗(第八章:IO库)
- java mail 已发送_JavaMail获取已发送邮件
- spark 序列化_spark shell 配置 Kryo 序列化
- django之Form表单
- 用python分析拼多多_利用Python分析拼多多上卖的最热的产品, 结果出乎大多数人意料!...
- 高等数学(工本)选择题
- DELL服务器常见报错信息
- webpack3基础总结
- 如何用计算机计算微积分,高数从此不用怕?一键计算微积分的神App
- 教室多媒体计算机主频,多媒体教室配置和列表.doc
- 关于编译错误ambiguous call of overridden pre R14 auto-imported BIF get/1
- [CF 417D]Cunning Gena:状压DP
- 牛客 华华听月月唱歌 贪心
热门文章
- 【PHP基础】Cookie基础知识、应用案例代码及攻防
- java自适应响应式 企业网站源码 SSM 生成静态化 手机 平板 PC
- 谷歌浏览器默认开启无痕浏览
- 有2个学生,每个学生有3门课程的成绩,从键盘中输入学生数据(包括学号,姓名 3门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中
- 传感器测试--声音采集与FFT 分析
- linux修改文件夹磁盘,linux下修改磁盘卷标
- linux修改磁盘标签,Ubuntu挂载硬盘,修改卷标
- 小姜腚腚雯雯小敏的爱情故事
- Liunx(2) 发送邮件通知
- struts logic:iterate标签用法