NOIP 2000解题报告
题目简单,思路很快就有,关键是代码实现能力,大概3个多小时完成。
第一题:
题目大意:将一个10进制数N转换成-B进制数 (负进制转换);B<=20, N(-32768<=N<=32767);
解题过程:首先想到仿照 正进制转换过程,但结果中有负数,就想到把负数处理掉,加个B即可,为了是结果不变,比它高1位的那一位要加1,这样某一位又有可能出现B这个数字,同理减去一个B,高位减去1;重复知道全部是0到B-1的数字;
40分钟一次AC
第二题:
题目大意;给定一个N位数字,用k个乘号将其划分为k+1个部分,使得乘积最大;
解题过程:平时做到过类似的,直接套用动态规划方程,处理好边界,F【i】【j】表示前i个数字划分成j个数字的最大值,可由F【p】【j-1】转移而来;
30分钟左右写完,但第一次提交只过了1个点,结果貌似是数据的问题,多了空格回车什么的,我的输入用了(按照样例每行多读一个回车)
for (int i=0;i<=n;i++)
scanf("%c",&str[i]);
就挂了;
改成
for (int i=1;i<=n;i++)
str[i]=s[i-1];
就AC了;
第三题:
题目大意:单词接龙,将一些单词首尾接起来(A的尾和B的头相等),每个单词最多用2次,比如beast和eastern可以接成beastern,求以给定的字母开头的最长的能接起来的单词长度,单词个数N<=20,
解题过程
看到数据范围较小,想到用搜索,首先预处理每个单词后面可以接哪些单词,并且记录重叠部分的长度,然后深搜;
第一次提交只过了4个点,原因有2个:
1.预处理的时候应该使得两个单词的重叠部分尽可能短,应该从小到大枚举,我用了从大到小。
2.单词后面可以接它自己。。(仔细揣摩样例应该可以看出来的)
修改2次后AC;
耗时50分钟左右
第四题:
题目大意:方格取数的变形,就是走2次,走过的格子分数变为0,求最大分数;
解题过程:
这题在NOI导刊上看过,在建兰培训时也讲过原题,30分钟左右写完一次AC;首先令两次走的路线不会交叉(可以碰到),因为如果交叉可以换一种走法就变成不交叉的但有重合的了。。以走的总步数step和第一次走的向右走了i步,第二次走的向右走了j步为状态转移;
第一次总得分300左右(100一题来算的话。)
教训:
题目要多看几遍,要好好揣摩样例是怎么得出解得,不要大概看懂了题目就开始写。