Wannafly挑战赛26 B 冥土追魂
首先,证明结果一定是取某些整行,再加上一个多余的一行的前几个。
假如:
x1<=x2<=x3<=x4<=x5
y1<=y2<=y3<=y4<=y5
取6个,最优解是取x3,x4,x5,y3,y4,y5。那么:
(1)如果y3>=x2,那么y3+y4>=x1+x2。就取掉y3,y4取x1,x2更优。
(2)如果y3<x2,那x3就>y2,那就去掉x3,x4取y1,y2更优。
因此结果不会出现2行不整的。给出条件了,那么要取的整行的数量也确定了。多出来几个(记为k)也确定了。那用sum[i]记录该行取整行时,maxk[i]记录该行取最大的k个时的结果。问题在于,一行被作为整行了就不能作为前k个了。这样不能贪心,能举反例。
比如
1 1 1 1
0 0 0 5
取5个。
这样只能dp了。dp[i][j][0]记录前i行,取了j个整行,还没取多余行的最小。dp[i][j][1]记录前i行,取了j个整行,已经取多余行的最小。那么第i行能作为整行取,dp[i][j][0]=dp[i-1][j-1][0]+sum[i]。也能不取,说明i-1行时已经有j个整行了。也能作为多余行取。注意开始时将不能到的点解决一下,给个大的值。
//#pragma comment(linker,"/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include <stack>
#include <iomanip>
using namespace std;
typedef long long lon;
const lon SZ=,INF=0x7FFFFFFF;
const double EPS=1e-;
vector<lon> vct[];
lon sum[],maxk[];
lon dp[][][]; int main()
{
//std::ios::sync_with_stdio(0);
//freopen("d:\\1.txt","r",stdin);
//for(;scanf("%d",&n)!=EOF;)
{
lon n,m,k;
cin>>n>>m>>k;
lon rem=k%m,num=k/m;
for(lon i=;i<=n;++i)
{
vct[i].assign(m,);
for(lon j=;j<m;++j)cin>>vct[i][j],sum[i]+=vct[i][j];
sort(vct[i].begin(),vct[i].end(),greater<lon>());
//for(int j=0;j<vct[i].size();++j)cout<<vct[i][j]<<" ";
//cout<<vct[i].size()<<" "<<endl;
for(lon j=;j<rem;++j)maxk[i]+=vct[i][j];
//cout<<maxk[i]<<endl;
}
memset(dp,0x3f,sizeof(dp));
//for(lon i=0;i<=num;++i)dp[0][i][1]=0x3f3f3f3f,dp[0][i][0]=0x3f3f3f3f;
dp[][][]=;
for(lon i=;i<=n;++i)
{
for(lon j=;j<=min(i,num);++j)
{
if(j==)dp[i][j][]=;
else dp[i][j][]=min(dp[i-][j][],dp[i-][j-][]+sum[i]);
dp[i][j][]=min(dp[i-][j][],dp[i-][j][]+maxk[i]);
dp[i][j][]=min(dp[i][j][],dp[i-][j-][]+sum[i]);
//cout<<i<<" "<<j<<" "<<dp[i][j][0]<<" "<<dp[i][j][1]<<" "<<maxk[i]<<endl;
}
}
if(rem==)cout<<dp[n][num][]<<endl;
else cout<<dp[n][num][]<<endl;
}
return ;
}
Wannafly挑战赛26 B 冥土追魂的更多相关文章
- Wannafly挑战赛26题解
为啥混进了几道不是魔禁的题--出题人太不敬业了-- 传送门 \(A\) 御坂网络 为啥没有番外个体和整体意志呢 暴力模拟就好了,这个要是都打错我干脆滚回去学文化课算了 //minamoto #incl ...
- Wannafly 挑战赛 19 参考题解
这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...
- 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)
牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...
- Wannafly挑战赛25游记
Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...
- Wannafly挑战赛27
Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...
- Wannafly挑战赛21A
题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...
- Wannafly挑战赛24游记
Wannafly挑战赛24游记 A - 石子游戏 题目大意: A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏.操作包含以下两种: 把石子 ...
- Wannafly挑战赛25C 期望操作数
Wannafly挑战赛25C 期望操作数 简单题啦 \(f[i]=\frac{\sum_{j<=i}f[j]}{i}+1\) \(f[i]=\frac{f[i]}{i}+\frac{\sum_{ ...
- Wannafly挑战赛18B 随机数
Wannafly挑战赛18B 随机数 设\(f_i\)表示生成\(i\)个数有奇数个1的概率. 那么显而易见的递推式:\(f_i=p(1-f_{i-1})+(1-p)f_{i-1}=(1-2p)f_{ ...
随机推荐
- topcoder srm 440 div1
problem1 link 二分答案,然后计算总时间.跟$T$比较确定要增大答案还是减小答案. problem2 link 可以看作是以‘*’所在位置为根的树.所以每个非根节点都有一个父节点. 那么每 ...
- Firemonkey的几个特色属性(二)
3.RotationAngle 控件的旋转角度,可以通过TAnimation进行角度旋转控制. 4.RotationCenter 控件旋转的中心位置,从(0,0)到(1,1),缺省是(0.5,0.5) ...
- selinux权限问题【转】
本文转载自:https://blog.csdn.net/u011386173/article/details/83339770 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...
- aria2的下载配置
aria2的命令行命令是: aria2c 一种方式: aria2c "http://host/file.zip" 如同wget 第二种方式: rpc server方式:
- # bzoj2215: [Poi2011]Conspiracy 2-sat
bzoj2215: [Poi2011]Conspiracy 2-sat 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2215 思路 一个点的 ...
- HDU 4638 Group(莫队)题解
题意:n个数,每个数有一个值,每次询问一个区间,问你这个区间能分成连续的几段(比如7 1 2 8 就是两端 1 2 和 7 8) 思路:莫队.因为L.R移动顺序wa了20发...问了一下别人,都是先扩 ...
- CentOS 7.3 上安装docker
Docker,分为社区版CE和企业版EE.社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务. 一.安装docker 1.Docker 要求 CentOS 系统的内核版本高于 3 ...
- 简单数论总结1——gcd与lcm
并不重要的前言 最近学习了一些数论知识,但是自己都不懂自己到底学了些什么qwq,在这里把知识一并总结起来. 也不是很难的gcd和lcm 显而易见的结论: 为什么呢? 根据唯一分解定理: a和b都可被分 ...
- SQL语句总结2018-11-7
增加一条数据 insert into table (列字段1,列字段2)values(列1值,列2值) 删除一条数据 delete from table where 列名1=值1 修改一条数据 upd ...
- IOS学习笔记一1
//创建.h文件 界面的类文件(创建一个类) @interface MyClass:NSObject{ //类变量声明 int a; int b; } //类属性声明 (int) p2 //类方法声明 ...