首页 > 其他分享 >CF1997F Chips on a Line 题解

CF1997F Chips on a Line 题解

时间:2024-08-01 18:53:26浏览次数:15  
标签:筹码 题解 rep 位置 int Line fl dp Chips

注意到操作是可逆的,可以先把所有筹码移动到位置 \(1\),再进行若干次操作使筹码数量最小化。

那么我们只需要对每一个 \(i\) 知道有多少种情况把筹码全移动到位置 \(1\) 后恰好有 \(i\) 个筹码,和这类情况的最少筹码数。

记 \(f_i\) 表示斐波那契数列的第 \(i\) 项,显然一个位置 \(i\) 的筹码移动到位置 \(1\) 后会变成 \(f_i\) 个筹码。于是可以做一个 dp,记 \(\operatorname{dp}_{i,j,k}\) 表示前 \(i\) 个位置放 \(j\) 个筹码,全部移动到位置 \(1\) 后有 \(k\) 个筹码的方案数。需要滚动数组,每次直接 \(\mathcal O(1)\) 转移。

接下来考虑怎么算最少筹码数。因为操作是可逆的,所以每次可以将 \(f_i\) 个位置 \(1\) 的筹码替换成一个位置 \(i\) 的筹码。考虑贪心,从一个较大的 \(f_i\) 开始枚举,每次选择尽量多的位置 \(1\) 的筹码替换该位置的筹码,显然是最优的。

最后只需要把最少筹码数等于 \(m\) 的方案数加起来就做完了,时间复杂度 \(\mathcal O(xf_xn^2)\)。

参考代码:

#include<bits/stdc++.h>
#define mxn 200003
#define md 998244353
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rept(i,a,b) for(int i=a;i<b;++i)
#define drep(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
int n,x,m,ans,f[30],dp[2][1002][55002];
bool fl;
inline void add(int &x,int y){
	x+=y;if(x>=md)x-=md;
}
signed main(){
	cin>>n>>x>>m;
	f[1]=f[2]=1;
	rep(i,3,25)f[i]=f[i-1]+f[i-2];
	dp[0][0][0]=1;
	rep(i,1,x){
		fl^=1;
		rep(j,0,n)rep(k,0,f[i]*j){
			dp[fl][j][k]=dp[fl^1][j][k];
			if(j&&k>=f[i])add(dp[fl][j][k],dp[fl][j-1][k-f[i]]);
		}
	}
	rep(i,0,n*f[x]){
		int s=0,x=i;
		drep(j,25,2){
			s+=x/f[j];
			x%=f[j];
		}
		if(s==m)add(ans,dp[fl][n][i]);
	}
	cout<<ans;
	return 0;
}

标签:筹码,题解,rep,位置,int,Line,fl,dp,Chips
From: https://www.cnblogs.com/zifanoi/p/18337256

相关文章

  • 洛谷题单指南-前缀和差分与离散化-P3029 [USACO11NOV] Cow Lineup S
    原题链接:https://www.luogu.com.cn/problem/P3029题意解读:不同的坐标位置有不同种类的牛,要计算一个最小的区间,包括所有种类的牛。解题思路:由于坐标位置不连续,并且数值范围较大,因此需要离散化处理,将坐标处理成1~n连续分布由于种类编号数值范围也比较大,也需要离散化处理,去重后的......
  • Luogu P1613 跑路 题解 [ 蓝 ] [ 倍增 ] [ Floyd 最短路 ] [ 状压 dp ]
    跑路:绝佳倍增好题,思路是化\(2^k\)为\(1\),倍增起预处理作用。最近不知道是撞了什么运,前一脚看的是绿题,写完之后交一发,发现直接被lxl升蓝了,血赚。思路:Floyd首先观察到每次走\(2^k\)的代价为\(1\),我们可以预处理出每次走\(2^i\)能到哪些点。但为了让这题的代码更好实......
  • 我想参数化我的 pipeline.yaml 文件,但 Ploomber 无法读取我的 env.yaml 文件
    我使用诗歌。它在目录中。然后创建了一个子目录(名为“src”),Ploomber在该子目录中正常工作,加载正确的文件。但是当我在与第一个子目录(“src”相同的级别)创建第二个子目录(名为“src_common”)时"),我遇到了问题:ploomber无法正确加载第二个子目录(“src_common”)中的参数......
  • 二、单变量的线性回归 univariate linear regression——预测问题
    2.1单变量线性函数假设函数hθ(x)=θ0+θ1x代价函数:平方误差函数或者平方误差代价函数h(x(i))是预测值,也写做y帽,y(i)是实际值,两者取差分母的2是为了后续求偏导更好计算。目标:最小化代价函数,即minimizeJ(θ0,θ1)得到的代价函数的三维图如下将三维图平面化等高......
  • 题解:CF1015D Walking Between Houses
    题解:CF1015DWalkingBetweenHouses算法模拟,分类讨论分析首先,设每步走的距离为\(t_i\),我们发现\(t_i\)应是满足\(1\let_i\len-1\)的。那么就很容易推出NO的情况:当\(s<k\)时,由于每一步都要至少走一个单位,所以\(k\)次步数肯定用不完,而题目要求恰好\(k\)次;当......
  • CF716B Complete the Word 题解
    CF716BCompletetheWord题解分析首先观察数据范围是\(50000\),可以考虑\(O(n)\)暴力。在字符串中枚举子串开始的位置\(i\),然后再枚举\(i\)到\(i+25\),开个桶统计每个大写字母出现的次数,如果大于\(1\)就直接break。统计完之后剩下的就都是问号了,可以随便填,所以这个子......
  • P3043 [USACO12JAN] Bovine Alliance G 题解
    P3043[USACO12JAN]BovineAllianceG题目传送门思路首先分情况讨论每种联通块的可能,有三种不同的情况会对答案\(ans\)产生不同的贡献。联通块有环如图,因为每条边都有要有归属,所以环上的边只能全都顺时针或逆时针属于某个点,且不在环上的点仅有一种可能。因此该情况对答......
  • 题解:CF687C The Values You Can Make
    CF687CTheValuesYouCanMake题解题目翻译感觉不明不白的(至少我看了几遍没看懂),这里给个较为清晰的题面。题目描述给你\(n\)个硬币,第\(i\)个硬币有一个价值\(c_i\),你需要从中选出一些价值和为\(k\)的硬币组成一个集合,再输出这个集合中硬币可能组成的价值和。算法动......
  • 题解:CF559B Equivalent Strings
    CF559BEquivalentStrings题解题目描述吐槽一下,题目翻译有歧义。思路分析你会发现,当你需要判断字符串\(a,b\)是否等价时,如果长度为偶数,需要继续判断字符串\(a\)拆分的字串。所用知识s.substr(i,j)//在字符串s中,从位置i开始截取长度为j的字串参考代码#include<bits......
  • 题解:CF718A Efim and Strange Grade
    CF718AEfimandStrangeGrade题解算法贪心+模拟思路分析显然,要最优每一次进位就只能五入不能四舍。而且当我们五入时,要取位数最高的。比如说\(1.3535\),我们有两种进位方式,一种是进位成\(1.4\),一种是进位成\(1.354\),显然前者更优。那这道题给的次数有啥用呢?考虑一种“......