首页 > 其他分享 >勇攀山丘小队(翻越篇)1——题解

勇攀山丘小队(翻越篇)1——题解

时间:2024-09-25 22:27:31浏览次数:1  
标签:int 题解 nullptr cin long tie 勇攀 翻越 define

前言

胸有丘壑,气吞山河。

正片

A 题:

考虑使用 DP,由于题目给了 2 个 a 不能在一起的限制,所以每次接上一个 a 都要考虑一下前面的一个状态是否也是 a。

于是就可以使用 \(f,g\) 数组,\(f_i\) 表示第 \(i\) 个字母是 a 的合法情况有多少,\(g_i\) 表示第 \(i\) 个字母是 b 或 c 的合法情况有多少。

预处理出 \(i=1\) 的情况,即 \(f_1=1,g_1=2\)。

AC code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2000;
int n,f[N],g[N];//f[i]a,g[i]b,c
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>n;
	f[1]=1,g[1]=2;
	for(int i=2;i<=n;i++){
		f[i]=g[i-1];
		g[i]=f[i-1]*2+g[i-1]*2;
	}
	cout<<g[n]+f[n]<<"\n";
	return 0;
}
/*

*/

B 题:

证明可以用数学归纳法或者一些分讨做,这里就不过多阐述。

可以发现规律:\(n\) 是奇数的时候,一定是 tao 赢;否则是 chang 赢。

AC code

#include<bits/stdc++.h>
//#define int long long
using namespace std;
int T;
int n;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>T;
	while(T--){
		cin>>n;
		if(n&1) cout<<"tao\n";
		else cout<<"chuan\n";
	}
	return 0;
}

C 题:

依旧考虑使用 DP。

\(f_{i,0}\) 表示 \(i\) 颗蓝宝石可以转换成多少枚 1 级的蓝宝石;\(f_{i,1}\) 表示 \(i\) 颗红宝石可以转换为多少枚 1 级的蓝宝石。

初始化:\(f_{i,0}=1\)。

根据题意直接列出转移方程:

\[f_{i,0}=f_{i-1,1}+y\times f_{i-1,0} \]

\[f_{i,1}=f_{i-1,1}+x\times f_{i,0} \]

AC code

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef array<int,2> AR2;
typedef pair<int,int> PII;
typedef unsigned long long ULL;
#define fi first
#define se second
const int dx[]={},dy[]={};
const int N=200010;
int n,x,y;
int f[N][2];//f[i][1]红宝石
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>n>>x>>y;
	f[1][0]=1;
	for(int i=2;i<=n;i++){
		f[i][0]=f[i-1][1]+y*f[i-1][0];
		f[i][1]=f[i-1][1]+x*f[i][0];
	}
	cout<<f[n][1]<<"\n";
	return 0;
}

标签:int,题解,nullptr,cin,long,tie,勇攀,翻越,define
From: https://www.cnblogs.com/Merge-Change230/p/18432377

相关文章

  • P8907 [USACO22DEC] Making Friends P 题解
    P8907[USACO22DEC]MakingFriendsP题解我们考虑维护每个\(i\),在\(i\)的后面有多少个点和它有朋友关系。初步的想法是每删掉一个人就给集合里所有的点连边。但是我们发现这样太不优了,有很多边会重复连很多次。优化的想法是对于\(i\),删去之后连的边就成了一个完全图,于是......
  • [GYM103119K][2020 ICPC Asia Macau] Candy Ads 题解
    题意简述有\(n\)个广告,每个广告在一个时间段内占据二维平面的矩形,\(m\)个约束表示两个广告至少有一个要被选择,选择若干广告,满足所有约束且同时刻不能有重叠的广告。Kosaraju算法流程在正图上跑一遍DFS,给每个位置打上时间戳从时间戳大到小枚举点,在反图上跑DFS,这个时候对......
  • 题解 洛谷P3398 仓鼠找 sugar
    原题链接:P3398仓鼠找sugar题解里大部分都是用的lca,然而我看不懂那些关于lca的性质是怎么证明出来的。不过这题可以直接用树链剖分来写,把模板套上去就好了。题意为查找两条路径是否存在公共点,我们只需要把其中一条路径上的点都赋值为1,然后查询另一条路径上的点的总和,如果总和......
  • [ARC062F] AtCoDeerくんとグラフ色塗り 题解
    思路对于一个点双,我们可以发现:假如它是一个简单环,那么它只能旋转这一个环,我们可以使用polya定理计算。假如它是多个环的组成,那么它的颜色可以随意调动,任何的情况都可以得到,那么假如说有\(m\)条边,方案数则为\(\binom{m+k-1}{k-1}\),我们只考虑每一种颜色的出现次数。对于......
  • 题解 QOJ5034【>.<】/ BC2401D【可爱路径】
    必可赛前公益众筹赛第一试Dhttps://qoj.ac/problem/5034,2022-2023集训队互测Round6(Nov12,2022)题目描述这原本是一道简单的最短路问题,但是由于种种地域文化,宗教信仰以及政治因素,原来一些或许可以行走的路径不能通行了。我们定义禁止路径为连续的经过一些特定的点的......
  • Luogu_P10977(AcWing_299) Cut the Sequence 题解
    解题思路考虑线性dp。首先如果存在\(a_i>m\),那肯定不满足条件,输出\(-1\)。设\(f_i\)表示前\(i\)个数分成若干段,然后每段最大数之和,其中每段内的整数之和不超过\(m\)。\(f_i\)肯定是由\(f_j\)(\(1\lej<i\))转移过来的,也就是前\(j\)个数分好后再加上\((j,i]\)这一......
  • 【OJ题解-1】稀疏矩阵乘法
    一、试题题面计算两个稀疏矩阵相乘,输出相乘的结果【输入输出约定】输入:第一行输入三个正整数p、q、r,表示p×q和q×r的两个矩阵相乘;(约定0<p,q,r≤1000)然后是第一个矩阵的输入,首先是一个整数m,表示矩阵一有m个非零元素;然后是m行,每行三个整数i,j,d,表示第i行,第j列的元素为d(约定......
  • P8906 [USACO22DEC] Breakdown P 题解
    P8906[USACO22DEC]BreakdownP题解显然的套路是删边转化为加边。考虑到维护整条路径不好维护,于是考虑转化维护\(f_{i,k},g_{i,k}\)分别表示\(1,n\)到\(i\)走了\(k\)步时的最短路。那么此时\(k\le4\)。我们先考虑\(f\)的转移,\(g\)的转移是等价的。那么对于\((......
  • 题解:CF573D Bear and Cavalry
    因为这是远古题目,所以根据现在的评测机速度,用\(O(nq)\)的做法也是可以过的。也就是说,我们可以每次操作直接修改对应位置上的数字,然后设计一种\(O(n)\)的算法求解答案。这道题类似资源分配型动态规划,所以我们可以设\(dp_i\)表示分配前\(i\)个人的答案。直接写是不行的,我......
  • 题解:AT_abc204_e [ABC204E] Rush Hour 2
    变形的dijkstra。先思考什么情况下需要等待以及等待多长时间最优。我们把题目上的计算方法按照当前的时间\(t\)和通过所需的时间\(f(t)\)列个函数关系:\[f(t)=t+c+\lfloor\frac{d}{t+1}\rfloor\]然后用Desmos画个图可以得到图像(其实就是对勾函数):因为\(c,d\geq0\),所......