题意:

有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的更多相关文章

  1. 2019 牛客多校第六场 J Upgrading Technology

    题目链接:https://ac.nowcoder.com/acm/contest/886/J 题目大意 略. 分析 见代码. 代码如下 #include <bits/stdc++.h> u ...

  2. 牛客多校第六场 J Heritage of skywalkert 随即互质概率 nth_element(求最大多少项模板)

    链接:https://www.nowcoder.com/acm/contest/144/J来源:牛客网 skywalkert, the new legend of Beihang University ...

  3. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  4. 牛客多校第五场 J:Plan

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

  5. 牛客多校第六场-H-Pair

    链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the numb ...

  6. 牛客多校第六场 C Generation I 组合数学 阶乘逆元模板

    链接:https://www.nowcoder.com/acm/contest/144/C来源:牛客网 Oak is given N empty and non-repeatable sets whi ...

  7. 牛客多校第10场J Wood Processing 分治优化/斜率优化 DP

    题意:你有n块木头,每块木头有一个高h和宽w,你可以把高度相同的木头合并成一块木头.你可以选择一些木头消去它们的一部分,浪费的部分是 消去部分的高度 * 木头的宽度,问把n块木头变成恰好m块木头至少要 ...

  8. 2019牛客多校第六场J-Upgrading Technology(枚举+单调队列)

    Upgrading Technology 题目传送门 解题思路 对于这题,我们可以枚举一个k从0~m,表示当前我们把所有技能最少升到了k级,且至少有一个为k级. 此时我们刚好获得了前k个d[]的收益, ...

  9. 牛客多校第七场H Pair 数位dp理解

    Pair 题意 给出A B C,问x取值[1,A]和y取值[1,B]存在多少组pair<x,y>满足以下最小一种条件,\(x \& y >c\),\(x\) xor \(y& ...

随机推荐

  1. 项目到上传Gitee

    1.码云上创建一个项目 testgit (名字随你) 2.本地创建一个文件夹D:/testgit,然后使用git bash 3.cd 到本地文件夹中D:/testgit, 4.使用 git init ...

  2. 【命令】Maven命令

    当前项目的依赖树: mvn dependency:tree -U.-B.-e -U参数: 该参数能强制让Maven检查所有SNAPSHOT依赖更新,确保集成基于最新的状态,如果没有该参数,Maven默 ...

  3. 再学 GDI+文本输出文本样式

    代码文件: unit Unit1; interfaceuses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls ...

  4. python从入门到大神---3、浮光掠影python3语法

    python从入门到大神---3.浮光掠影python3语法 一.总结 一句话总结: 语法不必一次记全部,效率太差,用哪部分内容,就把那部分内容全部记下来 1.python3中单引号和双引号的区别是什 ...

  5. trackback 捕获异常并打印

    ### 1 except Exception as e: print(traceback.format_exc()) def _handle_thread_exception(request, exc ...

  6. C++之引用与符号“&”

    一.&的意思: 1.取地址符,这时候它用于数据的前面,比如int a=&b; 2.C++里还使用&作为引用符,如果你确认程序是标准的C而非C++的话,那么可以排除是引用了.引用 ...

  7. GIT学习记录3(分支管理)

    学习参考地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 本编随笔只是自己对 ...

  8. Metasploit 模块和位置

    Metasploit Framework由许多的模块组成的. 一.Exploits(漏洞模块) 定义为使用“有效载荷(payloads)”的模块 没有“有效载荷”的攻击是辅助模块 二.Payloads ...

  9. 剑指offer——22表示数值的字符串

    题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...

  10. sacnf遇到空格与回车问题

    看scanf输入的是多个字符还是一个字符.如果是多个字符,遇空格和回车都不会结束输入:如果是一个字符,遇空格不会结束,遇回车结束输入.如:①#include<stdio.h>        ...