牛客多校第六场 J Upgrading Technology dp
题意:
有n个技能,一开始都是0级,第i个技能从j-1级升到j级,花费$c_{i,j}$,但是花费不一定是正的
所有的技能升到j级时,奖励$d_j$但是奖励也不一定是正的
题解:
用sum[i][j]储存-c[i][j]的前缀和,即技能i升到j级后总共的收益。
再用w[j]储存f[j]的前缀和,代表所有的技能都升到j的收益。
再开一个数组maxxx[i][j]用于储存技能i至少升到j级的收益,即max(sum[i][j~m])。
然后枚举j,计算$w_j+\sum_{i=1}^{n}maxxx[i][j]$即可
但这样带来一个问题,对于某个j,假如每种技能在最少升到j级的情况下,最优情况都是需要升到更高级,那么,所有的技能都升级带来的奖励d你就必须收下,即便这个d是负的。
因此,定义bonus=maxxx[i][j]-sum[i][j],代表某个技能因为升到高于j得到的额外奖励,当对于某个j,所有的技能带来的bonus都大于0,就减去那个最小的bonus,表示以最小的代价把一个技能打回j级,这样就保证了计算出来的奖励d是正确的。
#include<iostream>
#include<cstring>
#define LL long long
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
LL sum[][];
LL maxxx[][];
LL d[]; int main(){
// int i;
// int j;
int t;
scanf("%d",&t);
// for(int i=0;i<=1000;i++){
// for(int j=0;j<=1000;j++){
// printf("%lld ",sum[i][j]);
// }
// printf("\n");
// }
for(int tt=;tt<=t;tt++){
int n,m;
scanf("%d %d",&n,&m);
// memset(sum,0,sizeof sum);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%lld",&sum[i][j]);
sum[i][j]=-sum[i][j];
sum[i][j]+=sum[i][j-];
}
// for(int j=0;j<=m;j++)printf("%lld ",sum[i][j]);
// printf("\n");
maxxx[i][m]=sum[i][m];
for(int j=m;j>=;j--){
maxxx[i][j-]=max(sum[i][j-],maxxx[i][j]);
//最少修炼到第j层时最大收益
}
// for(int j=0;j<=m;j++)printf("%lld ",maxxx[i][j]);
// printf("\n");
}
for(int i=;i<=m;i++){
scanf("%lld",&d[i]);
d[i]+=d[i-];
}
LL maxx=;
for(int j=;j<=m;j++){
//最少修炼到第j层
LL now=d[j];
int bonustimes=;
LL minbonus=INF;
for(int i=;i<=n;i++){
now+=maxxx[i][j];
if(maxxx[i][j]>sum[i][j]){
bonustimes++;
minbonus=min(minbonus,maxxx[i][j]-sum[i][j]);
}
}
// printf("bun:%lld\n",minbonus);
if(bonustimes==n)now-=minbonus;
maxx=max(maxx,now);
}
printf("Case #%d: %lld\n",tt,maxx);
}
return ;
}
PS:
本题带来了一个教训,格式输入一定不要偷懒,要对于所有的数据类型都采用正确的格式符号,即便题目限定了输入范围。
比如在做这道题时,我发现,如果你用%d输入long long,因为%d只给了变量的后32位赋值,但是注意,对于负数,因为补码运算,int 和long long不是简单的截掉头部的关系。
比如你输入-1,32位的-1是11111111111111111111111111111111
但是如果乱用格式符号,导致64位变量只有后32位被赋值,则变成了0000000000000000000000000000000011111111111111111111111111111111
这个数对应的是4294967295
浮点数乱七八糟的就更多了。
正确的格式符号:
scanf:%d->int %lld/%l64d->long long (视编译器而定) %f->float %lf->double
printf:%f->float/double
如果忽略这点,就会导致莫名其妙的wa。
牛客多校第六场 J Upgrading Technology dp的更多相关文章
- 2019 牛客多校第六场 J Upgrading Technology
题目链接:https://ac.nowcoder.com/acm/contest/886/J 题目大意 略. 分析 见代码. 代码如下 #include <bits/stdc++.h> u ...
- 牛客多校第六场 J Heritage of skywalkert 随即互质概率 nth_element(求最大多少项模板)
链接:https://www.nowcoder.com/acm/contest/144/J来源:牛客网 skywalkert, the new legend of Beihang University ...
- 牛客多校第3场 J 思维+树状数组+二分
牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...
- 牛客多校第五场 J:Plan
链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客多校第六场-H-Pair
链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the numb ...
- 牛客多校第六场 C Generation I 组合数学 阶乘逆元模板
链接:https://www.nowcoder.com/acm/contest/144/C来源:牛客网 Oak is given N empty and non-repeatable sets whi ...
- 牛客多校第10场J Wood Processing 分治优化/斜率优化 DP
题意:你有n块木头,每块木头有一个高h和宽w,你可以把高度相同的木头合并成一块木头.你可以选择一些木头消去它们的一部分,浪费的部分是 消去部分的高度 * 木头的宽度,问把n块木头变成恰好m块木头至少要 ...
- 2019牛客多校第六场J-Upgrading Technology(枚举+单调队列)
Upgrading Technology 题目传送门 解题思路 对于这题,我们可以枚举一个k从0~m,表示当前我们把所有技能最少升到了k级,且至少有一个为k级. 此时我们刚好获得了前k个d[]的收益, ...
- 牛客多校第七场H Pair 数位dp理解
Pair 题意 给出A B C,问x取值[1,A]和y取值[1,B]存在多少组pair<x,y>满足以下最小一种条件,\(x \& y >c\),\(x\) xor \(y& ...
随机推荐
- eclipse打包jar及第三方jar包一起导出(生成SDK)
一.前言: 因公司需求,需要将某个工具类供外部使用,所以需要生成jar文件.但是jar内还包含了第三方的jar,普通的打包方式无法将lib下的第三方jar包提取. 这将会导致工具jar无法运行,或Ex ...
- systemctl命令的使用及服务状态的查看
二.systemctl命令 systemctl list-units ##列出当前系统服务的状态 systemctl list-unit-files ##列出服务的开 ...
- react 路由使用react-router-dom
react 和vue一样都是使用封装history 来进行页面跳转,下面就来说一下react常用的路由插件react-router-dom这个东西在GitHub上 目前是最受欢迎的 首相还是先下载 n ...
- 过滤掉map集合中key或value为空的值
package cn.com.utils; import org.apache.commons.lang3.StringUtils; import java.util.Collection; impo ...
- bcc-tools工具之profile
profile是用于追踪程序执行调用流程的工具,类似于perf中的-g指令 相比perf -g而言,profile功能化更加细分,可以根据需要选择追踪层面,例如-U(用户要调用流程) -K (内核态调 ...
- 其它课程中的python---2、NumPy模块
其它课程中的python---2.NumPy模块 一.总结 一句话总结: numpy在数组计算方面又快又方便 1.NumPy中的ndarray是一个多维数组对象,该对象由哪两部分组成? -实际的数据 ...
- trackback 捕获异常并打印
### 1 except Exception as e: print(traceback.format_exc()) def _handle_thread_exception(request, exc ...
- map、filter、forEach、reduce数组方法的封装
1.map方法的封装 Array.prototype.mapAlley = function(callback){ //获取调用mapAlley这个方法的数组 let arr = thi ...
- OSI七层网络模型分别是哪七层?各运行那些协议?
本文摘自:https://blog.csdn.net/JeremyZJM/article/details/78184775 应用层 DHCP · DNS · FTP · Gopher · HTTP · ...
- 史上最全Redis面试题及答案。
花了大量时间整理了这套Redis面试题 首发50题,绝无仅有,从入门到精通 从基础,高级知识点,再到集群,运维,方案- 弄明白了这些题可以说可以成为面霸了 面试官都得折服,Redis学得怎么样,都来检 ...