您的位置:首页 > 其它

151014的测试总结

2015-10-14 16:27 148 查看

【T1】

考查的知识点:DP

【题目及题号】hello superoj925

【题解】

f[i][j]表示alice拿了i个数字bob拿了j个数字的最大和。

对于第i位数字,对和产生的贡献实际可以用digit[i]*t[i],t[i]是预处理出来的10^X 次方。

然后转移方程就很明显

f[i][j] = max(f[i-1][j]+digit[i+j]*t[i],f[i][j-1]*digit[i+j]*t[j]);

【考试ING】

做这道题的时候觉得应该是DP,然后我设计状态的时候傻逼了,想要把它搞成一维的,然而发现并不行。

【我也不知道自己怎么想的,数据范围那么小还想搞一维,简直有病。】

然后又去写了个贪心,但是贪心一拍就错,这道题花了近两个小时调试【艹】,策略有问题( ⊙ o ⊙ )啊Orz

最后用半个小时打完了三个题的暴力,也没有查错。

T2和T3我还没开始想时间就差不多了,心碎。

注:其实这种DP的状态很常见,没有想出来大概是因为昨天晚上写汉诺塔写到十一点。

【T2】

考查的知识点:也许是哈希表?

【题目及题号】rect superoj926

【题解】

定义一个矩阵可以用其左上角的格子和右下角的格子来表示。那么用xiyixjyj可以表示一个矩阵。

这个题有一个很重要的性质,矩阵xiyixjyj的和 = sum[xi……xj]*sum[yi……yj];

有了这个性质就可以枚举sum[xi……xj],如果能被a整除,就记录下a除以它留下的数出现的次数【用hash表或者map】

最后再枚举一遍sum,累加不同的sum在hash中出现的次数。这样就表示原来的sum*现在的sum = a;

注意特判A为0的情况。

【考试ING】

最后交程序的时候把int 改long long了,然后内存直接炸掉了Orz.

然后下来改了内存,发现有一个问题就是我写30分暴力的时候统计sum是有错的。

假设用a[i][1]记录第i行第1列的原数字,当其相乘的时候是会被改变的,所以要另外开一个数组,代码区别如下:

RIGHT

for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
sum[i][j] = aa[i][1]*aa[1][j];


WRONG

for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
aa[i][j] = aa[i][1]*aa[1][j];


【T3】

考查的知识点:gcd 因数的性质

【题目及题号】half superoj927

【题解】

最暴力的想法就是枚举每个数的因数,分别看其在其他数中出现的次数,找到那个达一半的最大的。

—————————–时间复杂度O(n^2*sqrt(ai))——————————-

对于大一些的数据,我们可以发现一个性质,对于每个数,它的因数是解的概率是(1/2)。

那么枚举10~20个数出错的概率就是(1/2)^20 可以忽略了。

现在的问题就变成了,已知因数的情况下如何快速统计每个因数出现的次数?

首先,如果a[i],a[j]都能整除x,那么gcd(a[i],a[j])必然也能整除x;

所以我们就可以利用这个性质,对于每个a[j]求其和当前枚举数的gcd记录次数。

最后统计的时候如果fac[v]%fac[j]==0那么fac[j]就要加上fac[v]出现的次数。

【考试ING】

傻逼的我暴力也写错了,枚举不应该从头到最大的数开方。

注意:对于概率较小的情况,可以采取类似的方式骗分,想想noip2014的解方程是怎么写的吧。

最后的总结

傻逼的我干傻逼的事。以后千万别再把所有时间耗在一个题上了。

尤其是,明明知道写的是贪心【非正确算法】还想提高正确率的时候,先确定所有题都不能做的时候再来骗分吧。惨痛的教训Orz。

最让人悲伤的事情是,我调了那么久的题,最后我还是只交了卡时暴力。unhappy!

题目预估分数实际分数
Hello3080
Rect300
Half4010
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: