大假期第一次测试

今天算是返校第一天,进行了一次测试,分数少的可怜,也不知道该说些什么。总感觉题目有点思路,代码就是写不上来,很难受。有的就是思路错了,T3不知道我咋想的,我居然当背包问题做了。

 

 大假期第一次测试

还是看题吧:

T1太恶心了,我真的不知道该说什么了

题目描述

下面数列的第 n 项:

 f(0)=a0,   f(1)=a1,   f(2)=a2,   f(n)=b*f(n-1)+c*f(n-2)+d*f(n-3)+e(n>=3),输出f(n)的后18位,不足的用0在前补齐

样例

样例输入

1 2 3 4 5 6 7 3

样例输出

000000000000000035 

我就不写代码了,太麻烦了。我把虎哥代码放这里了https://www.cnblogs.com/kuangbiaopilihu/p/13305015.html

(读书人的事情怎么能算偷呢——鲁迅

T4也懒得写,一起发了吧https://www.cnblogs.com/kuangbiaopilihu/p/13304530.html

大假期第一次测试

 

T2

题目描述

菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。

棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束。落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋子。

_Itachi听说有不少学弟在省选现场AC了D1T1,解决了菲菲和牛牛的问题,但是_Itachi听说有的人认为复杂度玄学,_Itachi并不想难为学弟学妹,他想为大家节约时间做剩下的题,所以将简化版的D1T1带给大家。

_Itachi也在一块n行m列的棋盘上下棋,不幸的是_Itachi只有黑棋,不过幸好只有他一个人玩。现在,_Itachi想知道,一共有多少种可能的棋局(不考虑落子顺序,只考虑棋子位置)。

_Itachi也不会为难学弟学妹们去写高精度,所以只需要告诉_Itachi答案mod 998244353(一个质数)的结果。

样例

样例输入1

1 1

样例输出1

2

样例输入2

2 3

样例输出2

10

样例输入3

10 10

样例输出3

184756

没有图也不好说明白,大家自己可以拿纸画一下,斜过来就是一个杨晖三角了。虎哥说学长也讲了另一个思路,用C(m+n,n)这个组合数%998244353。

需要用到逆元(不知道的去查逆元的定义)

大假期第一次测试

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 const int mod = 998244353;
 5 long long qpow(int a, int b) {
 6     long long ans = 1;
 7     while(b) {
 8     if(b&1) ans = (ans*a) %mod;
 9     a=a*a%mod;
10     b>>=1;
11     }
12     return ans%mod;
13 }
14 long long solve(int a, int b) {
15     long long ans = 1;
16     for(int i = 1; i <= b; i++) ans *= (a-i+1), ans %= mod;
17     for(int i = 1; i <= b; i++) {
18     ans *= qpow(i,mod - 2); ans %= mod;
19     }
20     return ans % mod;
21 }
22 signed main() {
23     int  x, y; cin>>x>>y;
24     cout << solve(x+y,min(x,y));
25     return 0;
26 }

View Code

T3就比较简单了

题目描述

小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。

乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。 ……

1 2 3 4 5……N

乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见样例),每种类型的卡片上分别标有1、2、3、4四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。

游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的分数总和。

很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡片使用顺序使得最终游戏得分最多。

现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到多少分吗?

样例

样例输入1

9 5 
6 10 14 2 8 8 18 5 17 
1 3 1 2 1 

样例输出1

73

样例1解释

小明使用爬行卡片顺序为1,1,3,1,2,得到的分数为6+10+14+8+18+17=73。注意,由于起点是1,所以自动获得第1格的分数6。

样例输入2

13 8 
4 96 10 64 55 13 94 53 5 24 89 8 30 
1 1 1 1 1 2 4 1 

样例输出2

455

此题是NOIP2010提高组的题,很明显一眼就是动规题,我也看出来了,但我用背包做的,结果WA了,其实硬说这个题和背包有关就是用到了背包思想,因为数据范围极小,直接四维数组动规

大假期第一次测试

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=350+10;
 4 int a[maxn],d[45][45][45][45],b[5];
 5 int main(){
 6     int n,m;
 7     scanf("%d%d",&n,&m);
 8     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
 9     for(int i=1,p;i<=m;i++){scanf("%d",&p);b[p]++;}
10     d[0][0][0][0]=a[1];
11     for(int i=0;i<=b[1];i++)
12      for(int j=0;j<=b[2];j++)
13       for(int k=0;k<=b[3];k++)
14        for(int l=0;l<=b[4];l++){
15            int num=a[1+i+2*j+3*k+4*l];
16            if(i) d[i][j][k][l]=max(d[i][j][k][l],d[i-1][j][k][l]+num);
17            if(j) d[i][j][k][l]=max(d[i][j][k][l],d[i][j-1][k][l]+num);
18            if(k) d[i][j][k][l]=max(d[i][j][k][l],d[i][j][k-1][l]+num);
19            if(l) d[i][j][k][l]=max(d[i][j][k][l],d[i][j][k][l-1]+num);
20     }
21     printf("%dn",d[b[1]][b[2]][b[3]][b[4]]);
22     return 0;
23 }

View Code

 

 

原文链接: https://www.cnblogs.com/gdxzq/p/13307669.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    大假期第一次测试

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/366679

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午4:54
下一篇 2023年3月2日 下午4:54

相关推荐