2016.6.18纪中模拟赛
来源:互联网 发布:盛势网络剧07bilibili 编辑:程序博客网 时间:2024/05/18 20:13
题目:
https://jzoj.net/junior/#contest/home/1313
T1:这道题其实就是noip2000提高组的简单版。因这道题只需转化为-2进制,所以我们可以将输入的n一直 div -2即可,然后当n为负数的时候,会有一点变数。例:-15÷-2=8...1,而计算机中根据div的性质是7...-1,所以我们当n mod -2<>0的时候我们就要把得到的n div -2加1.然后每次得到的n都需记录一个abs(n mod 2),最后输出即可。
T2:这道题很明显的动态规划题目。其意就是在一个序列里,每次可以取首尾两端,当取了任意一端后,又会产生新的首尾,于是又在新的首尾里继续取首尾两端,最后求一个取数的顺序,来保证求得的答案最大,答案的计算方式是
答案+当前取的数的数值*当前取了几个数。
例:
5
1 3 1 5 2
取数顺序为1,5,2,3,4,这样答案就是1*1+2*2+3*3+4*1+5*5=43。
做这道题目最容易想到的就是贪心,也就是对当前首尾两端取一个min,然后用这个min来记录。
但很容易举出反例:
6
6 7 8 1 2 9
贪心策略的顺序是:6,7,8,1,2,9.答案=112
而正确的顺序应是:9,2,1,6,7,8.答案=123
可见,贪心有时候可能为了一点点小利益而丢失了大利益,所以贪心往往是错误的,正确的解法应该是动态规划。
那么我们需先确定这是一个动态规划的题目。
我们知道这道题符合最优子结构,也就是问题的最优解可以划分为它的子问题的最优解。其次因为1~n的顺序不能改变,所以,又满足了无后效性(不管1~i你怎么选,都不可能对其他的数产生影响)
确定是动规之后,我们就可以划分阶段了,我一开始想到的就是把他按区间划分,也就是分为一个区间一个区间,用f[i,j]表示i~j这个区间能取到的最优值。
很明显,对于i~j这个区间,只有2种情况。
一、先取i。
二、先取j。
第一种情况:
a[i]+f[i+1,j]+sum[i+1,j],加上sum[i+1,j]是因为一个选的是i,后面选的数都会在原来的最优情况下从2乘起,所以加一个(i+1...j)的数的和。
第二种情况与第一种情况相仿(自己解决)
最后输出f[1,n]即可。
- 2016.6.18纪中模拟赛
- 2016.6.11纪中模拟赛
- 2016.3.19纪中模拟赛
- 2016.5.21纪中模拟赛
- Brothers 纪中4764 模拟
- 麻将_纪中3066_模拟
- Brothers_纪中4764_模拟
- 十滴水_纪中1702_模拟
- 衡阳八中noip2014模拟赛day1
- [福州三中NOIP模拟赛]女装
- 2016.3.19纪中——中山市小学生信息学邀请赛2016模拟赛
- Memcache 中模拟 namespace
- JQuery中模拟句柄
- JQuery中模拟句柄
- JavaScript中模拟NameSpace
- Lua 中模拟 类
- js中模拟栈
- js中模拟队列
- Linux下find命令使用
- 用类模板改写stack
- 【c++程序】取一个数的近似值
- 二叉树的深度及平衡二叉树40
- js---javaScript九九乘法表演示、导入css的使用
- 2016.6.18纪中模拟赛
- 1018
- 小白进阶之堆排序
- info
- 查找斐波纳契数列中第 N 个数。
- Activity的生命周期
- android 让一个控件按钮居于底部的几种方法
- Arduino 卡片12彩灯调光台
- Geekband STL与泛型编程 第二周笔记 暗影行者