NOIP2016普及组第四题魔法阵解说+水法
来源:互联网 发布:gta5麦克捏脸数据 编辑:程序博客网 时间:2024/05/04 10:23
其实呢,这道题大部分是思路,对于信息学的代码啊、算法啊,并没有特别高的要求。
看到题目数据,便大吃一惊:数据里的水分呢???暴搜和水法肯定是不能AC的了。不过,“数据就像海绵,只要挤,总是有水的。”事实证明,“水法真神奇,暴力出奇迹”同样适用于这道题目。4重循环,时间O(n4)也是可以水到过半的分的。然而,顿时又通过b-a=2(d-c)这个等式,可以在已知a,b,c的情况下直接求出d。时间O(n3),拿到75分不是问题。接着,通过b-a<(c-b)/3和b-a=2(d-c)这两个式子解方程/不等式可以发现(b-a)是偶数、c>b*4-3*a等取值范围,这样可以拿到80~85分。
接着,正解:
通过b-a<(c-b)/3和b-a=2(d-c)这两个式子解方程/不等式得出,a,b,c,d之间的关系图(d-c=i)(k>0):
2i >6i(6i+k) i
___|______|___________________|___|___
a b c d
(a) (a+2i) (a+8i+k) (a+9i+k)
这时候,就可以依次枚举i,a,k三个数以得出结果,时间O((n div 9)*(n-9i-1)*(n-i*9)。然并卵,这样还是会超时。所以可以加点优化。
不难发现,每一次枚举i中会重复多次求可能的,k的方案数,而c,d就是目标(a+8i+k和a+9i+k),所以,我们可以在每一次枚举i的起始位置,先求出c的取值范围在i~j之间的c,d取法数。然而这样会爆空间,所以,我们就用w[i]表示c的取值范围在i~n之间的c,d取法数。则w[i]-w[j+1]表示c的取值范围在i~j之间的c,d取法数。而w数组就是后缀和,再用相对的方法将s数组中存a的前缀和。
当你完成这一切时,你就可以利用前后缀和将程序活生生压成for i中四个for j的四重循环了打上输入输出,AC和同学们在前方等着你!!!
补充:对于不会优化、不会三重循环、甚至暴力都不会的蒟蒻们,我也很人性化的给你们发福利了!!!看好了,现在我要从裤兜里掏出一个几乎每道题目都适用的超级算法——水法!!!(提醒:这只是一个85分的程序,不要想多了,怎么可能有可以ACNOIP普及组第四题的水法!)
var a,b,c,d,n,m,i,j:longint; s:array [1..15000,1..4] of longint;//答案 bj:array [1..15000] of longint;//每个数出现的次数 t:array [1..40000] of longint;//储存输入的N个数begin assign(input,'magic.in'); reset(input); assign(output,'magic.out'); rewrite(output); readln(n,m); n:=0; for i:=1 to m do begin readln(t[i]); inc(bj[t[i]]); if t[i]>n then n:=t[i]; end;//输入 for a:=1 to n do if bj[a]>0 then begin b:=a+2; while b<=n do begin if bj[b]>0 then begin for c:=4*b-3*a+1 to n do //由公式得出 if bj[c]>0 then begin d:=c+(b-a) div 2;//三重循环枚举 if bj[d]>0 then begin inc(s[a,1],bj[b]*bj[c]*bj[d]); inc(s[b,2],bj[a]*bj[c]*bj[d]); inc(s[c,3],bj[a]*bj[b]*bj[d]); inc(s[d,4],bj[a]*bj[b]*bj[c]);//更新答案 end; end; end; inc(b,2); end; end; for i:=1 to m do begin for j:=1 to 4 do begin write(s[t[i],j],' '); end; writeln; end;//输出 close(input); close(output);end.
1 0
- NOIP2016普及组第四题魔法阵解说+水法
- NOIP2016普及组第四题——魔法阵
- NOIP2016普及组第四题——魔法阵
- noip2016普及组复赛第四题 T4魔法阵
- NOIP2016 普及组第四题 魔法阵magic 题解
- NOIP2016普及组第四题——魔法阵
- NOIP2016普及组第四题——魔法阵
- 【NOIP2016】普及组魔法阵
- [NOIP2016普及] 魔法阵
- 【noip2016普及】魔法阵
- 【原创】【NOIP2016普及组】魔法阵
- 【NOIP2016普及组复赛】魔法阵
- 【NOIP2016普及组复赛】魔法阵
- NOIP2016普及组[魔法阵]题解
- 2105. 【NOIP2016普及组复赛】魔法阵
- 【noip普及组2016】第四题“魔法阵”
- NOIP2016普及组 第四题 题解
- 初中OJ2105【NOIP2016普及组复赛】魔法阵
- Linux 基础教程——命令行基础
- AR!!!高通Vuforia-iOS-SDK 和官方Demo 集成到iOS 项目中所需要注意的几点.
- Java中对小数进行精确的运算
- 【Scrapy爬虫系列1】爬虫的几大问题——抛砖引玉
- 插入排序
- NOIP2016普及组第四题魔法阵解说+水法
- js:判断浏览器的类型
- git pull/commit时,提示 “bad index file sha1 signature fatal: index file corrupt”错误
- STK Component:Evaluator pattern(计算器模式)
- leetcode(61).225. Implement Stack using Queues
- Kafka中gradle.properties源码
- 从内核文件系统看文件读写过程
- 4-1 Shortest Path [3]
- 学Java遇到的问题