首页 > 其他分享 >[lnsyoj729/luoguP1450/HAOI2008]硬币购物

[lnsyoj729/luoguP1450/HAOI2008]硬币购物

时间:2024-09-28 17:34:50浏览次数:1  
标签:cnt le int sum lnsyoj729 long include luoguP1450 HAOI2008

题意

给出一个长度为 \(4\) 的序列 \(c\),给出 \(n\) 个询问,每个询问给出一个长度为 \(4\) 的序列 \(d\) 和 整数 \(s\),要求构造出长度为 \(4\) 的序列 \(t\),使得 \(s = \sum_{i=1}^4 c_i \cdot t_i\),且 \(\forall (x \in \R) \land (1 \le x \le 4), t_x \le d_x)\),求 \(t\) 的方案数

sol

一眼多重背包问题,但无论使用哪种做法都无法在 \(1s\) 内解决,只好思考容斥。
(注:接下来,我们记 \(cnt_x\) 表示满足 \(x = \sum_{i=1}^4 c_i \cdot t_i\)的方案数)
答案显然不是 \(cnt_s\),因为存在序列 \(d\) 限制。考虑减掉对于 \(1\sim 4\) 中的每个数 \(i\),当 \(t_i > d_i\) 时的方案数,即 \(cnt_{s - c_i \cdot (d_i + 1)}\)(因为需要保证 \(t_i > d_i\),因此先选出 \(d_i + 1\) 个 \(c_i\),再正常选择)。
此时多减了两个数多选的情况,由此,即可写出容斥式

\(cnt\) 数组也很好计算,事实上,它就是完全背包一维优化的 \(f\) 数组。

代码

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 100005;

int c[4], d[4];
int n, s;
long long f[N];

int p(int x){
    return 1 - x % 2 * 2;
}

void init(){
    f[0] = 1;
    for (int i = 0; i < 4; i ++ )
        for (int j = c[i]; j <= 100000; j ++ )
            f[j] += f[j - c[i]];
    
}

int main(){
    scanf("%d%d%d%d%d", &c[0], &c[1], &c[2], &c[3], &n);

    init();

    while (n -- ){
        scanf("%d%d%d%d%d", &d[0], &d[1], &d[2], &d[3], &s);

        long long ans = 0;

        for (int s0 = 0; s0 < 16; s0 ++ ){
            int l = 0;
            long long sum = 0;
            for (int u = 0; u < 4; u ++ )
                if ((s0 >> u) & 1) l ++ , sum += (long long) c[u] * (d[u] + 1);
            
            if (s >= sum) ans += p(l) * f[s - sum];
        }

        printf("%lld\n", ans);
    }
}

蒟蒻犯的若至错误

  • init() 和 main() 中的下标起始位置不统一

标签:cnt,le,int,sum,lnsyoj729,long,include,luoguP1450,HAOI2008
From: https://www.cnblogs.com/XiaoJuRuoUP/p/-/lnsyoj729_luoguP1450

相关文章

  • P4290 [HAOI2008] 玩具取名(区间dp,传递闭包?)
    link有点传递闭包的思想感觉这题(无聊倒装首先为了便于处理,将W,I,N,G映射为1,2,3,4那么处理数据,想到可以用传递闭包的思想?感觉差不多,因为这道题有很多一一对应的关系对于每次输入对应的两个字符\(ab\),定义\(g[a,b,i]\in\{0,1\}\)表示对应关系题目要求给定一个串\(s\)......
  • P4290 [HAOI2008] 玩具取名
    原题链接题解1.复杂问题简单化,把字符用数字代替2.每次替换都会减少一个字符,到最后一定是由两个字符合成一个字符,并且这两个字符的来源区间不相交3.相同区间不同的合并方式,最后生成的字符也不同,所以dp多加一个状态4.题目只问能否合成对应字符code#include<bits/stdc++.h>us......
  • [HAOI2008] 糖果传递
    非常经典的数学题。设\(x_i\)表示\(i\)给右边的人多少糖(如果\(x_i<0\),就是从右边的人那里拿糖)。先考虑列出方程\[\left\{\begin{matrix}a_1-x_1+x_n=\bara\\a_2-x_2+x_1=\bara\\\cdots\\a_n-x_n+x_{n-1}=\bara\\\end{matrix}\right.\]用\(x_1\)表示\(x_......
  • P1 P2508 [HAOI2008]圆上的整点
    [HAOI2008]圆上的整点23.3.22WE.真是一道神题,特别是对于刚得了甲流滚回家摆烂从而有时间乱看而恰巧这几天上课刚学复数的我。一直很好奇复数到底是什么,昨天晚上刷B站学习偶然看到了一个解释虚数的视频,结果也没看懂,只听说乘上一个\(i\)相当于旋转\(90^{\circ}\),一想还真是!......
  • BZOJ 1042:[HAOI2008]硬币购物 容斥原理 背包dp
    1042:[HAOI2008]硬币购物TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 2505  Solved: 1505[Submit][Status][Discuss]Description硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次......
  • P1450 [HAOI2008] 硬币购物
    完全背包加上容斥,思想非常妙#include<bits/stdc++.h>#definefor1(i,a,b)for(inti=a;i<=b;i++)#definelllonglongconstintmaxn=1e5+5;constintin......
  • 洛谷P2512 [HAOI2008]糖果传递
    SLOJP1117.糖果传递题目描述有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为11。输入格式小朋友个数n,下面n行ai​......
  • P1450 [HAOI2008] 硬币购物
    P1450[HAOI2008]硬币购物已经八百年没写过题解了。先是因为懒,后是没有时间写了。但是这题印象属实深刻。任务列表里吃灰两个月想到了完全背包然后容斥bulabula的......
  • P2508-[HAOI2008]圆上的整点【数学】
    正题题目链接:https://www.luogu.com.cn/problem/P2508题目大意一个在\((0,0)\)的圆心,半径为\(r\),求圆有多少个整点。\(1\leqr\leq2\times10^9\)解题思路设这个......