挑选(pick)

1s/128MB

【题目背景】

NOIP2017 马上就要到了,丁爷爷想要从他的小朋友里挑选出一些厉害的来参加NOIP。

【题目描述】

丁爷爷共有 n 个小朋友,按编号 1 . . . n 从左到右排成一行。每个小朋友都有一个实力值,第 i 个小朋友的实力值为 wi。

丁爷爷作为一名爷爷,自然可以随意地挑选小朋友。但是如果他挑选的小朋友太靠  近,就免不了给人一种内定、钦点的感觉了。他并不想这么做,于是他制定出了一个  方案。

他给每个小朋友设置了一个气场值 ci,当丁爷爷挑选出 i 号小朋友参加 NOIP 后, 他会把它右边的ci个小朋友(不包被挑选的小朋友本身)都自动淘汰。这些被淘汰的小朋友加上被丁爷爷挑选出的小朋友立即被移出队伍。接着,丁爷爷就可以继续他的挑选工作。需要注意的是,如果此时右边的小朋友个数不足ci,那么丁爷爷是不能进行这次挑选的。

作为丁爷爷的粉丝,你和 Yazid 都对丁爷爷的挑选工作很感兴趣。

你想知道丁爷爷小朋友们最高的实力值总和,而 Yazid则对挑选小朋友的本质不同的方案数很感兴趣。(两种挑选方案本质相同,当且仅当两种方案最终挑选出的小朋友完全一致。)

众所周知,Yazid 是一名辣鸡蒟蒻,于是你就需要同时求解这两个问题。由于方案数可能很大,所以对于 Yazid 的问题,你只需要回答对 998244353 取模的结果即可。

【输入格式】

从文件 pick.in 中读入数据。

第一行一个正整数 n,表示小朋友的数目。

接下来一行 n 个用空格隔开的非负整数 w1 . . . wn,依次描述 1 号小朋友至n号小朋友的实力值。

接下来一行 n 个用空格隔开的非负整数 c1 . . . cn,依次描述 1 号小朋友至n号小朋友的气场值。

【输出格式】

输出到文件 pick.out 中。

输出一行 2 个用空格隔开的整数,第一个整数表示挑选出的小朋友实力值总和的最大值,第二个整数表示本质不同的挑选方案数对 998244353 取模的结果。

【样例 1 输入】

3

7 2 3

2 0 0

【样例 1 输出】

7 5

【样例 2 输入】

18

27 68 75 76 75 75 68 40 33 62 58 88 4 75 766 84 52

1 2 3 3 2 4 1 2 3 3 5 1 3 1 1 3 2 1

【样例 2 输出】

490 3348

【样例 3】

见选手目录下的 pick/pick3.in 与 pick/pick3.ans。

【提示】

样例 1 解释:你可以挑选出 {}, {1}, {2},{3},{2, 3} 这些小朋友的子集,因此方案数为

5。其中,{1} 这个子集的小朋友实力值总和最大,总和为 7(只有 1 号小朋友)。

【子任务】

对于10% 的数据,保证 n ≤ 9。对于 30% 的数据,保证 n ≤ 18。对于 60% 的数据,保证 n ≤ 200。

对于另外20% 的数据,保证所有的 wi= 1,保证所有的 ci= 1。对于 95% 的数据,保证n≤ 3, 000。

对于 100% 的数据,保证 n ≤ 5, 000,wi ≤ 10^7,ci <n。

由这个题意似乎可以往一种常见的dp去想那就是---括号序列!

这里我们显然可以转化成若第i个填左括号,那么就要有ci个右括号来与之匹配。

那不就非常简单了吗?!

dp[i][j]表示前i个小朋友中左括号与右括号的差为j的最大实力值。

则dp[i][j]=max{dp[i-1]j+1,dp[i-1][j-c[i]]+wi}

if j==0 dp[i][j]=max{dp[i][j],dp[i-1][j]}可以不取。

辣么最后的结果就是dp[n][0]啦~

初值dp[0][0]=0就ok啦。

g[i][j]表示前i个小朋友中左括号与右括号的差为j的方案总数。

也是一样的道理,将max改成累加即可。

这道题的变形有点考思路,但变形好之后就很基本了qwq下次要记住啊...

code

#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
const int mod = 998244353;
const int MAXN = 5005; inline ll read() {
ll k = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
k = (k << 1) + (k << 3) + (ch & 15);
ch = getchar();
}
if (f == -1) k = ~k + 1;
return k;
} inline void write(ll x) {
if (x < 0)
x = -x, putchar('-');
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
} int n;
int now;
ll w[MAXN],c[MAXN];
ll dp[2][MAXN],g[2][MAXN];
int main(){
freopen("pick.in","r",stdin);
freopen("pick.out","w",stdout);
//n = read();
scanf("%d",&n); for (int i = 1 ; i <= n ; i++){
//w[i] = read();
scanf("%d",&w[i]);
}
for (int i = 1 ; i <= n ; i++){
//c[i] = read();
scanf("%d",&c[i]);
} g[0][0] = 1; for (int i = 1 ; i <= n ; i++){
now = 1 - now;
for (int j = 0 ; j <= n ; j++){
if (j == 0){ dp[now][j] = max(dp[1 - now][j],dp[1 - now][j + 1]);
if(j >= c[i]) dp[now][j] = max(dp[now][j],dp[1 - now][j - c[i]]+ w[i]); g[now][j] = (g[1 - now][j] + g[1 - now][j + 1]) % mod;
if(j >= c[i]) g[now][j] = (g[now][j] + g[1 - now][j - c[i]]) % mod; } else{ dp[now][j] = dp[1 - now][j + 1];
if(j >= c[i]) dp[now][j] = max(dp[now][j],dp[1 - now][j - c[i]] + w[i]); g[now][j] = g[1 - now][j + 1];
if(j >= c[i]) g[now][j] = (g[now][j] + g[1 - now][j - c[i]]) % mod;
}
}
} //write(dp[now][0]),putchar(32),write(g[now][0]);
printf("%lld %lld",dp[now][0],g[now][0]);
return 0;
}

挑选(pick)的更多相关文章

  1. [leetcode]528. Random Pick with Weight按权重挑选索引

    Given an array w of positive integers, where w[i] describes the weight of index i, write a function  ...

  2. [LeetCode] Random Pick Index 随机拾取序列

    Given an array of integers with possible duplicates, randomly output the index of a given target num ...

  3. 精心挑选10款优秀的 jQuery 图片左右滚动插件

    在现代的网页设计中,图片和内容滑块是一种极为常见和重要的元素.你可以从头开始编写自己的滑动效果,但是这将浪费很多时间,因为网络上已经有众多的优秀的 jQuery 滑块插件.当然,如果要从大量的 jQu ...

  4. 最简单的可取消多选效果(以从水果篮中挑选水果为例)【jsDEMO】

    [功能说明] 最简单的可取消多选效果(以从水果篮中挑选水果为例) [html代码说明] <div class="box" id="box"> < ...

  5. 【精心挑选】15款最好的 jQuery 网格布局插件(Grid Plugins)

    如今,大多数网站设计要靠网格系统和布局,这能够提供给设计人员一个方便的途径来组织网页上的内容.网格的设计最常见于报纸和杂志的版面,由文字和图像构成的列组成. 这篇文章给大家分享精心挑选的15款最佳的 ...

  6. Random Pick Index

    Given an array of integers with possible duplicates, randomly output the index of a given target num ...

  7. The 2015 China Collegiate Programming Contest D.Pick The Sticks hdu 5543

    Pick The Sticks Time Limit: 15000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others ...

  8. bug检测报告---礼物挑选小工具--飞天小女警

    飞天小女警----礼物挑选小工具 测试产品链接:http://123.207.159.79:8088/giving_gifts/ 发布在作者的博客里面:http://www.cnblogs.com/s ...

  9. 《BI项目笔记》挑选产出分析Cube

    数据源设置: 数据处理逻辑: --I_GBGradeID SELECT * FROM T_NPick_PkgMov WHERE I_GBGradeID NOT IN ( SELECT I_GBGrad ...

随机推荐

  1. JavaScript新手经常遇到的问题(二)

    1.Form表单只提交数据而不进行页面跳转的方法 <script type="text/javascript" src="js/jquery/jquery-1.8. ...

  2. NetCore 3.0 中使用Swagger生成Api说明文档及升级报错原因

    认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参 ...

  3. SpringBoot-HelloWorld(三)

    HelloWorld 学一个新的框架,不写helloworld是没有灵魂的,嘿嘿 准备工作 我们将学习如何快速的创建一个Spring Boot应用,并且实现一个简单的Http请求处理.通过这个例子对S ...

  4. Spring Boot 整合 Druid

    Spring Boot 整合 Druid 概述 Druid 是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池.插件框架和 SQL 解析器组成.该项目主要是为了扩展 JDBC 的一些限制,可以让程 ...

  5. Redis 使用消息隊列

    關鍵函數 ListRightPush  生產消息 ListRightPop   消費消息 這是從右面增或取 左邊亦然

  6. 基于iSensor的MT9M001C12STM传感器调试总结

    iSensor APP 之 摄像头调试  MT9M001C12STM iSensor app 非常适合调试各种摄像头,已测试通过的sensor有: l  OV7670.OV7725.OV9650.OV ...

  7. 大数据学习笔记——Hadoop高可用完全分布式模式完整部署教程(包含zookeeper)

    高可用模式下的Hadoop集群搭建 本篇博客将会在之前写过的Linux的完整部署的基础上进行,暂时不会涉及到伪分布式或者完全分布式模式搭建,由于HA模式涉及到的配置文件较多,维护起来也较为复杂,相信学 ...

  8. python学习-while

    """while 条件: 条件满足时,干的事情.如果条件一直满足,一直去重复的执行代码.直接条件不满足为止,停止循环."""# salary ...

  9. deconstructSigs|探寻cosmic的独特“气质”-mutation signature !

    deconstructSigs-mutation signature看一下你的数据是什么“气质”的? 本文首发于“生信补给站” https://mp.weixin.qq.com/s/k7yzk9hPX ...

  10. super()派生使用中的常见两个错误

    """ super()派生可以继承父类的属性 --super()派生继承父类的语法是:super().__init__() --super().__init__()中的_ ...