首页 > 其他分享 >【题解】洛谷P2946 [USACO09MAR]Cow Frisbee Team S

【题解】洛谷P2946 [USACO09MAR]Cow Frisbee Team S

时间:2022-11-05 17:45:43浏览次数:55  
标签:Frisbee 洛谷 int 题解 j1 j2 划分 01 背包

这题乍一看是一个朴素的01背包问题,将所有方案的集合按照能力值的和来划分成1~m,然后把m当作体积,把n当作物品数,做一个01背包的代码。于是我兴冲冲地写了代码交上去,然后十组样例只过了八组,另外两个一个MLE, 一个TLE。然后仔细一看数据范围,才发现能力值的和太大了,按照能力值的和来划分子集肯定不行。

 

所以需要换成另外一种划分方式:按照所有奶牛能力值的和对F取余来划分,划分成0~F-1个集合,于是问题就转化成对这些集合作01背包了。

需要注意的是:

1. 不能用滚动数组优化。因为取余操作,后面的结果会影响到上一层的结果,譬如一个很大的j1和一个很小的j2, j1 更新后,会在j2更新的时候又更新一次(在j1和j2模F同余的时候)。所以只能用二维。

2. j - v[i] % F 有可能出现负数,所以 需要((j - v[i]) % F + F) % F,这是数学意义上的取余。

 

状态转移方程为

f[i][j] = f[i][j] + f[i - 1][j] + f[i - 1][((j - v[i]) % F + F)% F]

 

答案就是模F余0的数,就是f[n][0]。但是由于初始化的时候f[0][0]=1,所以答案需要减一。

代码如下。

 

#include <iostream>
#include <cstring>
using namespace std;

const int N = 2010, mod = 1e8, M = 1010;
typedef long long LL;

int n, F;
int v[N];
int f[N][M];

int main() {
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> n >> F;
    for(int i = 1; i <= n; i++) cin >> v[i];
    
    f[0][0] = 1;
    for(int i = 1; i <= n; i++) {
        for(int j = 0; j < F; j++) {
            f[i][j] = LL(f[i - 1][j] + f[i - 1][((j - v[i]) % F + F) % F]) % mod;
        }
    }
    cout << f[n][0] - 1 << endl;
    return 0;
}

 

标签:Frisbee,洛谷,int,题解,j1,j2,划分,01,背包
From: https://www.cnblogs.com/xioa-chou/p/16860671.html

相关文章

  • accoders NOI #5047. 猜数游戏 题解
    题目描述Alice和Bob玩游戏。Alice有一个\(1~n\)中的正整数\(y\)。Bob不知道这个数。游戏中的每一轮,Bob选一个正整数\(x\),并提问Alice:\(y\)是否大于等于\(x......
  • 「题解」Codeforces 1612F Armor and Weapons
    首先可以不管套件,假定\(n<m\),那么答案不超过\(\mathcal{O}(\logn+\frac{m}{n})\),也就是先倍增把\(n\)造出来,然后一步步造\(m\).答案这么小,那么常见的套路就是把答案......
  • 问题解决:vscode运行python找不到文件
    问题描述:使用VSCode执行Python代码调用其他文件时报FileNotFound错误,终于发现是VSCode工作路径默认是当前文件所在工作区的根目录,而不是当前文件所在目录。发生条件:根......
  • 「题解」牛客练习赛105 F 胖头鱼头胖
    先对每个位置\(i\)对集合幂级数\(x^0+x^1+\cdots+x+x^{a_i}\)FWT,那么询问就是将区间里面所有FWT后的集合幂级数作点积再IFWT后提取\(x^s\)的系数。首先可以通......
  • P2484 [SDOI2011]打地鼠 题解
    P2484[SDOI2011]打地鼠题解目录P2484[SDOI2011]打地鼠题解题目分析思路代码题目P2484[SDOI2011]打地鼠题解分析锤子每次只能将每个洞里打掉一只地鼠,所以对于每......
  • P7365 [CTSC2002]颁奖典礼 题解
    一道神奇的有关网格的DP(一些大佬称其为暴力DP)。这里将“I”字母分为的三个部分称为第一,二,三部分。做法:设fi,j,k,l(l∈[1,3])表示第i行,当前在第l部分,区间[j,k]的......
  • 矩阵树定理学习笔记 & 洛谷 P4111 [HEOI2015]小 Z 的房间 题解
    矩阵树定理拉普拉斯矩阵无边权设无向图\(G\)有\(n\)个结点,则拉普拉斯矩阵\(L\)是一个\(n\timesn\)的矩阵,满足:\(L_{i,i}(i\inG)\)的值为结点\(i\)的度数......
  • 洛谷P2730 [USACO3.2]魔板 Magic Squares
    题目链接:点这里 一般这种从某种状态转移到目标状态的最短距离,都可以使用BFS来做。从题目给定的初始状态,依次执行题目给定的三种操作,分别是交换上下两行(操作A)、将最后......
  • 【题解】Luogu P8743 【[蓝桥杯 2021 省 A] 异或数列】
    最近刚好在刷博弈论,看到这道题没有题解,所以刚好来水一发题目链接[蓝桥杯2021省A]异或数列题目描述Alice和Bob正在玩一个异或数列的游戏。初始时,Alice和Bob......
  • Atcoder Beginner Contest ABC 275 Ex (H) Monster 题解
    先明确\(a_i\)是一个怪物的血量,\(b_i\)是攻击的代价。发现如果我们想攻击一个怪物,不如找出一个极大的包含它的区间,满足这个区间内所有怪物的攻击代价都不大于它本身的代价,......