牛客多校第六场 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& ...
随机推荐
- 在windows server 2012中安装完oracle 11 client如何使用
1.首先要添加监听配置,这样才可以没有报错的连接上服务器,至于如何添加,请自行搜索. 2.打开SQL Plus连接oracle server端,这里因为是小白,看到命令行界面上来就需要输入用户名密码 ...
- BeanUtils.copyProperties用法
spring的BeanUtils.copyProperties用法 原创 2010年06月03日 13:43:00 标签: spring / struts / 数据库 / 工具 / action 一. ...
- 自定义实现系统max方法
function MyMath(){ //添加了一个方法 this.getMax=function(){ //所有数字中的最大值 var max=arguments[0]; for(var i=0;i ...
- ifame问题
问题描述:在div中添加了点击事件,div中嵌套着一个iframe,父类的div事件全部都会被失效, 解决办法:给iFrame添加css pointer-events : none; 去掉了ifram ...
- JavaScript: 变量提升和函数提升
第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函 ...
- Ruby 中文编码
Ruby 中文编码 前面章节中我们已经学会了如何用 Ruby 输出 "Hello, World!",英文没有问题,但是如果你输出中文字符"你好,世界"就有可能会 ...
- alert样式优化
//alert样式优化 function alert(msg, mode) { //mode为空,即只有一个确认按钮,mode为1时有确认和取消两个按钮 msg = msg || ''; mode = ...
- 牛客多校第十场 B Coffee Chicken 递归
题意: 给你一个“斐波那契”字符串数列,第n项由第n-1项和第n-2项拼接而成,输出某项的某位及其后10位. 题解: 递归求解即可. #include<bits/stdc++.h> usi ...
- HtmlCleanner结合xpath用法(转载)
HtmlCleaner cleaner = new HtmlCleaner(); TagNode node = cleaner.clean(new URL("http://finance.s ...
- android:两个应用之间怎样传值之activity
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zjh171/article/details/37738579 两个应用之间怎样传值.事实上这个标题太 ...