洛谷 U19159 采摘毒瘤
题目背景
Salamander见到路边有如此多的毒瘤,于是见猎心喜,从家里拿来了一个大袋子,准备将一些毒瘤带回家。
题目描述
路边共有nn 种不同的毒瘤,第i 种毒瘤有k_i 个,每个需要占据d_i 的空间。Salamander的袋子能装下的最大体积为m 。
Salamander是一个很贪心的人,不过他也不要求带尽可能多或是总体积尽可能大的毒瘤回家,他只要求袋子里再也装不下剩余的任何一种毒瘤。
Salamander想知道有多少种不同的装毒瘤的方案。两种方案不同当且仅当取的毒瘤种类不同或者至少有一种毒瘤取的数量不同。由于方案数可能太多,请输出答案对19260817 取模后的结果。
输入输出格式
输入格式:
第一行包括两个正整数nn 、mm ,表示毒瘤的种类数和袋子的大小。
接下来的nn 行,每行两个正整数k_i 、d_i ,表示一种毒瘤。
输出格式:
一行,表示不同的方案数对19260817 取模后的结果。
输入输出样例
2 5
2 3
3 1
2
说明
样例解释:
两种方案如下:
1.取1个第一种毒瘤和2个第二种毒瘤。
2.取3个第二种毒瘤。
~ ~
对于10%的数据,1\leq n,k_i,d_i\leq 101≤n,ki,di≤10 ,1\leq m\leq 1001≤m≤100 ;
对于30%的数据,1\leq n,k_i,d_i\leq 501≤n,ki,di≤50 ,1\leq m\leq 50001≤m≤5000 ;
对于另外20%的数据,k_i=1ki=1 ;
对于100%的数据,1\leq n,k_i,d_i\leq 5001≤n,ki,di≤500 ,1\leq m\leq 10^5。
多重背包的一个烂大街的优化就是单调队列,这个没啥好说的。。
本题可以枚举剩的最小的体积是哪个背包,一旦最小的确定了那么对答案有贡献的dp数组的坐标范围就确定了。
所以我们把物品按体积降序排序之后依次加入然后更新答案即可。。
(我当然不会告诉你这个题坑特别多)
#include<bits/stdc++.h>
#define ll long long
#define maxn 100005
using namespace std;
const int ha=19260817;
int f[2][maxn],n,m;
int V,tot,sum;
struct node{
int v,num;
bool operator <(const node &u)const{
return v<u.v;
}
}a[505];
int ans=0; inline int add(int x,int y){
x+=y;
if(x>=ha) x-=ha;
return x;
} inline int X(int x,int y){
x-=y;
if(x<0) x+=ha;
return x;
} int main(){
scanf("%d%d",&n,&V);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].num,&a[i].v);
tot+=a[i].num*a[i].v;
}
sort(a+1,a+n+1); if(tot<=V){
puts("1");
return 0;
} f[0][0]=1;
int now=0,pre;
for(int i=n;i;i--){
tot-=a[i].num*a[i].v;
pre=now,now^=1; int base=a[i].v,len=base*a[i].num; for(int j=0;j<base;j++){
sum=0;
for(int u=j;u<=V;u+=base){
sum=add(sum,f[pre][u]);
if(u-j>=len) sum=X(sum,f[pre][u-len]);
f[now][u]=sum;
}
} int tp=V-tot;
for(int j=max(0,tp-a[i].v+1);j<=tp;j++) ans=add(ans,f[now][j]);
for(int j=len;j<=V;j++) f[now][j]=add(f[now][j],f[pre][j-len]);
} printf("%d\n",ans);
return 0;
}
洛谷 U19159 采摘毒瘤的更多相关文章
- 洛谷P4241 采摘毒瘤
传送门 完了我连背包都不会了…… 考虑暴力,先枚举最小的数是哪个,设大小为$d_i$,个数为$k_i$,所有比它小的数的总和是$sum$,然后把所有比它小的全都装进背包,它以及比他大的做一个多重背包, ...
- 洛谷 P4240 - 毒瘤之神的考验(数论+复杂度平衡)
洛谷题面传送门 先扯些别的. 2021 年 7 月的某一天,我和 ycx 对话: tzc:你做过哪些名字里带"毒瘤"的题目,我做过一道名副其实的毒瘤题就叫毒瘤,是个虚树+dp yc ...
- 洛谷P4240 毒瘤之神的考验 【莫比乌斯反演 + 分块打表】
题目链接 洛谷P4240 题解 式子不难推,分块打表真的没想到 首先考虑如何拆开\(\varphi(ij)\) 考虑公式 \[\varphi(ij) = ij\prod\limits_{p | ij} ...
- 洛谷P2179 骑行川藏
什么毒瘤... 解:n = 1的,发现就是一个二次函数,解出来一个v的取值范围,选最大的即可. n = 2的,猜测可以三分.于是先二分给第一段路多少能量,然后用上面的方法求第二段路的最短时间.注意剩余 ...
- 洛谷模拟NOIP考试反思
洛谷模拟NOIP考试反思 想法 考了这么简单的试qwq然而依然emmmmmm成绩不好 虽然本次难度应该是大于正常PJ难度的但还是很不理想,离预估分数差很多qwq 于是就有了本反思嘤嘤嘤 比赛链接 原比 ...
- [洛谷日报第62期]Splay简易教程 (转载)
本文发布于洛谷日报,特约作者:tiger0132 原地址 分割线下为copy的内容 [洛谷日报第62期]Splay简易教程 洛谷科技 18-10-0223:31 简介 二叉排序树(Binary Sor ...
- 洛谷P4689 [Ynoi2016]这是我自己的发明(莫队,树的dfn序,map,容斥原理)
洛谷题目传送门 具体思路看别的题解吧.这里只提两个可能对常数和代码长度有优化的处理方法. I 把一个询问拆成\(9\)个甚至\(16\)个莫队询问实在是有点珂怕. 发现询问的一边要么是一个区间,要么是 ...
- 洛谷P4581 [BJOI2014]想法(玄学算法,拓扑排序)
洛谷题目传送门 萝卜大毒瘤 题意可以简化成这样:给一个DAG,求每个点能够从多少个入度为\(0\)的点到达(记为\(k\)). 一个随机做法:给每个入度为\(0\)的点随机一个权值,在DAG上求出每个 ...
- 洛谷P4891 序列(势能线段树)
洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ...
随机推荐
- Python 黑魔法(持续收录)
Python 黑魔法(持续收录) zip 对矩阵进行转置 a = [[1, 2, 3], [4, 5, 6]] print(list(map(list, zip(*a)))) zip 反转字典 a = ...
- Leetcode 659.分割数组为连续子序列
分割数组为连续子序列 输入一个按升序排序的整数数组(可能包含重复数字),你需要将它们分割成几个子序列,其中每个子序列至少包含三个连续整数.返回你是否能做出这样的分割? 示例 1: 输入: [1,2,3 ...
- Ext JS表单Ext.form.FormPanel
1.表单 对于传统的b/s应用来说,数据录入元素是放在表单<form>标签里面的.而对于ExtJS应用来说,则可以直接使用FormPanel控件来存放表单中的元素.FormPanel继承自 ...
- HDU 4474 Yet Another Multiple Problem ( BFS + 同余剪枝 )
没什么巧办法,直接搜就行. 用余数作为每个节点的哈希值. #include <cstdio> #include <cstring> #include <cstdlib&g ...
- UVALive 5027 二分图 EK
C - Card Game Crawling in process...Crawling failedTime Limit:3000MS Memory Limit:0KB 64bit IO ...
- sqlachemy 原生sql输出
在创建引擎时,将echo参数配置成True,会输出sql执行语句记录.默认False create_engine(statsticConf.sqlalchemy_mysql,connect_args= ...
- UltraEdit 删除空行
UltraEdit 删除空行 数据里有大量的空行,想在UltraEdit里删除,在网上搜了很多方法都不管用,功夫不负有心人,最后终于找到了可用的方法: 搜索—>替换,在“查找什么”里输入:\n( ...
- js实现封装和继承
封装(模拟对象) http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html 继承 htt ...
- Pandas之DataFrame——Part 3
''' [课程2.] 数值计算和统计基础 常用数学.统计方法 ''' # 基本参数:axis.skipna import numpy as np import pandas as pd df = pd ...
- MySQL的菜鸟级操作
windows下启动和关闭mysql 启动(windows): 在命令行下,进入到mysql安装路径的bin文件夹下执行:net start mysql 关闭(windows): 在启动的情况下执行: ...