51 NOD 三级题总结

1013 3的幂的和 

等比数列求和公式啦~a1*(1-q^n)/(1-q)

 

1021 石子归并

一开始自己想的dp怎么都过不了T T。最后发现是数组初始化越界了(……)

做法1: dp[i][j]=区间[i,j]合并的最小花费。状态转移:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);第一层for了i,j的差(区间长度,一层一层更新)。第二层for区间左端点(右端点可以根据区间长度算嘛)。第三层for k,然后更新状态啦~

做法2:相同的dp数组定义和状态转移。第一层 从大到小for区间左端点。第二层for 区间右端点。第三层for中的用来更新的k。这样子有个优秀的地方就是因为i是递减的,j是递增得,所以求dp[i][j]的时候,dp[i][k]和dp[k][j]肯定都已经更新好啦!(好机智的赶脚……)

1035 最长的循环节

这题白写了……找了个板子套了一下然后过了= =

1043 幸运号码

又见dp啦。我写的时候设了两个dp数组,dp1[i][j]表示i为数,第一位可以为0时的各位和为j的数的个数,dp2[i][j]是i位数,第一位不可以为0时的各位和为j的数的个数。然后第一层for i 第二层for j.第三层for 0->9(dp1转移)或者1->9(dp2转移),表示第i位取0->9的时候的转移,状态转移方程:dp[i][j]+=dp[i-1][j-k];呃,写得比较丑了反正,其实可以用一个数组解决。dp[i][j]就表示i位数,第一位可以为0时和为j的数的个数,那么第一位不可以为0的和为j的i位数的个数即为dp[i][j]-dp[i-1][j].

1065 最小正子段和

很妙的想法。开结构体存1.前缀和2.下标,按大小排序。如果i<j&&pos[i]<pos[j]则区间[i,j]的和是>0的。假设排完序是abc,画一下所有a,b,c大小关系的图,我们会发现除了a,b,c降序排列无解,其它的更优解都是从排序后相邻的两项得到的。所以排完序之后比一下相邻的项a,b,如果pos[a]<pos[b]&&sum[a]<sum[b],那么ans=min(ans,sum[b]-sum[a]就可以啦!

1068 Bash游戏 V3

列一下前几项可以找到规律,如果这个数可以被3整除就是B,否则A。可以被三整除只要各位加起来能被三整除就可以惹。

1096 距离之和最小

在一对点之间怎么移动距离都是一样的,所以找个最中间的点然后算到其它所有点的距离就可以了。

1097 拼成最小的数

其实把所有的串排个序拼一下就可以了QAQ。串A和串B的比较:重载< returnAB<BA。就说两个拼起来比一下就可以了。嘤嘤嘤。

 

 

1548 欧姆诺姆和糖果

除了分块和莫队之外第一次碰到根号的。题目只有两种糖果。如果有某种糖果的重量>根号c,则它的个数一定小于根号c,for这种糖的个数,另外一种取最多就好惹。如果两种糖果的重量都<根号c,假设我买wa*wb重量的糖果,假设买了wb个a糖果,那么花费是wa*wb*ha,假设买了wa个b糖果,花费就是wa*wb*hb,若前者>后者,说明相同重量买a更赚嘛,如果能买到wa*wb那么多,那肯定买更划算的那个了。所以如果我买a糖果更划算,b糖果的数量不会超过wa个(wa*wb*ha>wa*wb*hb,如果买了wa个b,为什么不买wb个a呢?)。就for那种更不划算的糖的个数(假设a更划算),则for b糖果的数量,这个数量<wa,而wa<根号c。所以综合复杂度就是根号c惹。
1562 玻璃切割

这也是一个很神的想法。我正着用set分别维护x,y割的坐标以及每一段的长度,T了。看了题解发现,对于所有的操作可以倒着来。倒着怎么搞呢?问题就相当于我有一堆切开的玻璃,每次告诉你并上两块,问所有的玻璃中面积最大的那一块。这样子只用不停的更新最大值就可以了。咦,突然发现,正着的是每次要求变小之后的最大,但是倒着就是变大之后的最大,显然倒着更加优秀,以后可以分析一下让求的东西及其变化的规律吼,万一就发现倒着做更优秀呢。

1621 花钱买车牌

就是暴力for变成i号车牌,数组ans[i][j]和cost[i]存结果和花费。当已经满足有k个数为i时,用set记录每次变化,(按照花费、变大了还是变小了、变化的位置从小到大排序,优先级自己体悟一下,花费大优先,从小变大的优先,如果是从小变大,位置后的优先,否则位置前的优先)。每次把当前的数塞进set,然后把第一个拿出来恢复一下。如此如此最后在所有答案里找个最小的嘛。美滋滋。

1625 夹克爷发红包

就是给一个初始n*m的矩阵,每个数表示这个位置的人的初始红包。现在要发最多k组高级红包,每组可以横着发一排或者竖着发一排,并且要收回这一排或者这一列的初始红包。每个人只能有一个高级红包。问最后红包和最大是多少。n<=10,m<=100.

因为横着和竖着发了之后对相互之间是有影响的,各种关系肥肠复杂。应该注意到n贼小,咦,那我枚举个也才1000嘛。咦,剩下多少组我就丢给要收回的红包最少的那几列不就好啦。咦,做完了。

注意不是一定要发K组,如果初始红包很多岂不是反而亏了嘛。然后我没有注意到每个人只能拿一个高级红包的限制还WA了几发嘤嘤嘤。总共错了6发= =。

1631 小鲨鱼在51nod小学

哇这个题真的是太刺激了好吧。给n组信息,每组是两个年月日和一个独一无二的数x表示这段区间覆盖上x。如果两个日期不超过一个自然月就忽略。然后m个询问,问某一天有多少个x。

这题肝到一点……各种看数据找bug,服了自己了。现在做完之后仔细一想,咦,区间的操作,还要详细的信息,n又差不多,不分块我当时愣着干啥?看完题解说是分块。好吧开始了我的疯狂WA之路。1.年份映射到数组上的时候一开始写错了 2.其他的一些细节写错了 3.自然月的判断,可能前一年的12月到这一年的1月不足1月,没有判到。 4.后来发现,映射还是写错了!!啊!大哭。 最后哭着A了。

1636 教育改革

有n个课程,每个课程有一个区间范围内的作业数量和课程难度。现在上m天课,要求每天上的课难度递增,每天的作业量是前一天的+k或者k倍。要计算一个最大的总作业量。n,m<=50,k<=100,作业数量可以贼大,但是范围大小不会超过100。哎呀,这种题,一看首先就是一个dp对不对。dp[i]表示第几天起码的,=总作业最大量没错了。它说区间范围小,那么范围目测就是一维。呃,顺不下来……和女生赛那次的题像吧。dp[i][j][k]表示第i天,上了第j门课程,写了ai+k辣么多得作业的最大作业量和。状态转移方程:dp[i][j][z]=max(dp[i][j][k],dp[i-1][ _j ][j课程的左区间+z-k-_j课程的左区间])还有dp[i][j][z]=min(dp[i][j][z],dp[i-1][ _j ][(j课程的左区间-z)/k-_j课程的左区间。(这个是当j+z能被k整除的时候)。然后一套复杂的dp就下来了QWQ。

这可真是个神奇的dp。发现最近碰到的dp都是立足当前的i,j,k,去算哪些状态能推出当前状态,然后这样更新。我脑子老想的是有了当前状态,去更新可能达到的状态T T 。挠头。

 

哇。可喜可贺。第一周的第一次总结。写完啦。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值