考试总结 模拟88

T1做的比较顺利,性质整出来了,然后写了个dp 感觉很像87的T2,但是拿数据结构优化了半天没思路弃掉了

T2题干很长,描述了游戏,最后看见求概率,以为是大神题,心里就有些抵触??然后就eooo先弃了

接着看T3,心态比较炸,T1以为A的会不少,花了30min调整才真正开始思考

写完next_permutation,想着跟上次的six的dfs有点像,但没改过,

写了个dfs以为会拿到40分。。然后就发现复杂度算错了。。。

还有20min看T2,5min后。。30分模拟送分??!!!14分钟写完,30s试样例??没过??然后绝望的交了WA0

然后再看一眼题目,发现要输出属性值,加了几个字符就A了

不能匆忙交题!!!!把会的先打上,一定要先看完题目

T1「DP」「贪心」

先sort一下

可以证明最优的决策一定保证每个队列是连续的区间。

如果将某段连续区间的某一项干到别的区间那么显然会使最终答案变差

定义f[i][j]表示考虑到第i个人,且他是第j段区间的结尾,已经有了j段的最小值

f[i][j]=min{f[k][j-1]+(a[i]-a[k+1])^2}

可以发现本题的特殊之处在于只有6000个不同的身高

于是unique直接AC

注意特殊之处

T3「记忆化搜索」

可以发现最终结果跟种类无关,我们只关心有几个1,2,3(即要放的数量为1,2,3)

那么定义f[i][j][k][x]表示当前状态还剩i个1,j个2,k个3要放,上一个放的那个球,在上一次的数量为x

当前的ans大概就是当前放一个1/2/3之后的方案数之和,那么放一个2,就多一个1,少一个2

1 ll dfs(int i,int j,int k,int x){
2     if(!i&&!j&&!k)return 1;
3     if(f[i][j][k][x]!=-1)return f[i][j][k][x];
4     ll nw=0;
5     if(i) nw+=(i-(x==2))*dfs(i-1,j,k,1);
6     if(j) nw+=(j-(x==3))*dfs(i+1,j-1,k,2);
7     if(k) nw+=(k-(x==4))*dfs(i,j+1,k-1,3);
8     return f[i][j][k][x]=nw;
9 }

由于我们要保证相邻的小球颜色不能相同,所以记录x,看一下上一次放的是那种小球,这一次的那些小球中就不能放那一个所以-1

原文地址:https://www.cnblogs.com/casun547/p/11743659.html