首页 > TAG信息列表 > HAOI2008
[HAOI2008]硬币购物
link 一开始以为是一道智商税题目,结果发现似乎并没有那么简单。这道题给我提供了许多很有价值的思路。 首先多重背包是肯定会死的,二进制拆分似乎也并不是很有用处 (\(O(QN\log N)\)肯定超时),于是想到整体减空白。 整体是什么?显然会是没有限制,也就是所有硬币随便用时的方案数,此时直接【P2512 [HAOI2008]糖果传递】题解
题目链接 题目 有 \(n\) 个小朋友坐成一圈,每人有 \(a_i\) 个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为 \(1\)。 思路 设 \(x_i\) 表示第 \(i\) 个人传给前一个人的糖果数,负数则是反向传。 可以列出方程,然后依次把 \(x_i\) 用 \(x_1\) 表示出来,再设 \(c_i=\su[HAOI2008]硬币购物
题目链接: https://www.luogu.com.cn/problem/P1450 如果跑多重背包是O($N10^5log_210^5$)的, 这个效率是稳TLE的 但是发现, 硬币的数量其实很少, 只有4种, 原来这玩意能容斥 这是一个计数题, 可以采用总方案数-不合法方案数的操作 我们先用完全背包跑出没有限制的所有情况(总方案「BZOJ1045」「HAOI2008」糖果传递 题解 (贪心,数学)
题目简介 题目描述 有\(n\)个小朋友坐成一圈,每人有\(a_i\)个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为\(1\)。 输入 第一行一个正整数\(n\leq 10^6\),表示小朋友的个数.接下来\(n\)行,每行一个整数\(a_i\),表示第\(i\)个小朋友得到的糖果的颗数。 输出 求使所有[HAOI2008]玩具取名
VI.[HAOI2008]玩具取名 状压一下。 我们令\(f[i][j]\)为:区间\([i,j]\)的串,能转移到字母的状态(是个 bitmask ) 至于转移吗……劈开拼一起即可。 代码: #include<bits/stdc++.h> using namespace std; int m[4],n,tr[4][4],f[210][210]; int tran(char ip){ if(ip=='W')return 0; ifP1450 [HAOI2008]硬币购物
原题链接 考察:容斥原理+完全背包+计数dp 本蒟蒻是打死都想不到怎么用容斥原理... 错误思路: 乍看一下是多重背包,时间复杂度80*105*103(采用二进制优化)显然T了 正确思路: 采取完全背包预处理的方法,时间复杂度105 ,求出不限数量的取法.答案就是所有取法-P2512 [HAOI2008]糖果传递
P2512 [HAOI2008]糖果传递 #include<bits/stdc++.h> using namespace std; typedef long long ll; #define debug(x) cout<<#x<<':'<<x<<endl; const int maxn=1e6+100; ll a[maxn],n; int main(){ scanf("%lld",&n);洛谷P1450 P1450[HAOI2008]硬币购物
https://www.luogu.com.cn/problem/P1450 多重背包会T 题意转换: 已知ci,s,di,(i<=4) 求 Σ ai*ci=s ,ai<=di 的解的组数 类似于不定方程非负整数解计数,考虑容斥原理 满足4个ai<=di限制的方案 = 所有没有限制的方案 - 不满足至少一个限制的方案的并集 不满足至少一个限制的方案的并集[HAOI2008]硬币购物(容斥/背包DP)
题目 题目地址 题解 先跑一遍完全背包,然后对于第 \(i\) 种物品只能有 \(d_i\) 枚硬币容斥一下。具体的:(强制 \(k\) 个硬币超出限制) \[\sum_{T \subset D,|T|=k} (-1)^k \sum_{j \in T} f[s-c_i(d_i+1)] \](其中,\(D\) 是 \(4\) 种硬币构成的集合,\(f[i]\) 是完全背包后,\(i\) 体积有多[HAOI2008] 木棍分割 - dp,前缀和,双指针
Solution 第一问二分模板题,利用第一问答案做第二问 \(O(n^2m)\) 的 dp 是显然的,考虑用前缀和优化,用双指针预处理出转移位置的边界,于是每次转移复杂度 \(O(1)\),总体复杂度 \(O(nm)\) #include <bits/stdc++.h> using namespace std; #define int long long const int mod = 10007;HAOI2008 硬币购物
题目传送门 据说NOIP前写题解会\(\mathcal{RP}\)++ 看数据范围,肯定不能写多重背包,会\(T\)飞~ 如果每种硬币没有个数限制,就可以用完全背包了。 正难则反,我们可以先用完全背包预处理,然后减去不合法的情况。不合法的情况就是一个\(s-(d+1) \times c\)的背包 但如果我们直接减去,会导Luogu P1450 [HAOI2008]硬币购物
题目 一个很自然的想法是容斥。 假如只有一种硬币,那么答案就是没有限制的情况下买\(s\)的方案数减去强制用了\(d+1\)枚情况下买\(s\)的方案数即没有限制的情况下买\(s-c(d+1)\)的方案数。 现在是多种硬币,所以要加个容斥。 那么我们需要预处理一下没有限制的情况下买\(i\)的方案[HAOI2008]硬币购物-题解
传送门 题目描述 硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次有多少种付款方法。 输入格式 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s 输出格式 每次的方法数 输入输出样例 输入 #1 1 2 5 10 2【HAOI2008】硬币购物
题面 https://www.luogu.org/problem/P1450 题解 先完全背包,再考虑限制,容斥算一下就可以了。 #include<cstdio>#include<cstring>#include<iostream>#define N 100500#define ri register int#define int long long using namespace std;int c1,c2,c3,c4,tot;int d1,d2,d3,d4,s;i[HAOI2008] 硬币购物
容斥。 总方案数 - 不合法方案数。 #include <cmath> #include <queue> #include <cstdio> #include <cctype> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 100000 + 10; int n, val[5[HAOI2008]糖果传递
首先我们要用到一些均分纸牌的思想(已经理解这种思想的大佬请跳过): 设\(A_i\)表示第\(i\)个小朋友原有的糖果数量, 设\(ave\)表示所有小朋友糖果数量的平均数, \(X_i\)表示第\(i\)个小朋友向左传的糖果数量。即: ①如果\(X_i>0:\quad\) 第\(i\)个小朋友向左传\(X_i\)个糖果; ②否HAOI2008 木棍分割 数据结构优化dp+二分答案
很久之前打的题,现在补篇博客 打滚动数组 #E. 木棍分割 Accepted 100 1712 ms 1512 KiB 2019-05-07 17:01:23 Short 不打滚动数组 #419. [HAOI2008]木棍分割 Accepted 100 5219 ms 100960 KiB 2019-05-07 15:12:41 木棍分割 题P1450 [HAOI2008]硬币购物
传送门 每种硬币有数量限制,感觉很不好算 先考虑一下如果没用限制时可以怎么做 显然直接背包一下就可以了 设 $f[i][j]$ 表示前 $i$ 种硬币选了一些,总价值为 $j$ 的方案数,转移显然,并且可以滚动数组优化 但是现在有限制,考虑容斥,设 $f[j]$ 表示不考虑限制总价值为 $j$ 的方案 一开始答1044: [HAOI2008]木棍分割
二分答案限制最大的多少,然后再DP一下 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> const int Dollar1 = 10007; const int MAXN = 50010; inline int up(int x) { return x -= Dollar1, x + (x >> 31 & Dollar1); }Luogu-P4289-[HAOI2008]移动玩具
【题面】 题目描述: 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移动到某人心中的目标状态。 输入输出格式: 输入格式: 前4行