HDU YY's new problem
2016-03-12 15:05
411 查看
遇到一个很卡时间的题目,提交AC之后也是有时能过,有时不能过,偶然过了还真是实属不易,但是本题的思路和想法还是很需要说明一下的。
如果用纯暴力的方法,依次遍历序列中的各个数字,复杂度要O(n3),必定超时,则必须进行算法优化了,考虑到这个题目的特殊性,序列中只有n个数,而且是从1到n,需要满足的是 a-b=b-c (且a、b、c顺序不能改变)这样特点的式子,即可以转化为 a+c=2*b (且a、b、c顺序不能改变),即a+b一定要是偶数,且要采用记录下标的方法,(a+c)/2 的值所对应的下标在a的下标和c的下标之间,即可以找到满足这样关系的序列。实质为简单运用了一下Hash表。
HDU YY's new problem http://acm.hdu.edu.cn/showproblem.php?pid=3833
代码实现如下:
如果用纯暴力的方法,依次遍历序列中的各个数字,复杂度要O(n3),必定超时,则必须进行算法优化了,考虑到这个题目的特殊性,序列中只有n个数,而且是从1到n,需要满足的是 a-b=b-c (且a、b、c顺序不能改变)这样特点的式子,即可以转化为 a+c=2*b (且a、b、c顺序不能改变),即a+b一定要是偶数,且要采用记录下标的方法,(a+c)/2 的值所对应的下标在a的下标和c的下标之间,即可以找到满足这样关系的序列。实质为简单运用了一下Hash表。
HDU YY's new problem http://acm.hdu.edu.cn/showproblem.php?pid=3833
代码实现如下:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int a[10010]; int b[10010]; int main() { int t,n,sum; int flag; scanf("%d",&t); while(t--) { scanf("%d",&n); flag=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); b[a[i]]=i; //记录下标 } for(int i=1; i<=n; i++) { for(int j=i+1; j<=n; j++) { sum=a[i]+a[j]; if(sum%2==1) continue; else if(sum%2==0) { if((b[sum/2] > b[a[i]])&&(b[sum/2] < b[a[j]])) //if((b[sum/2] > i)&&(b[sum/2] < j) { flag=1; break; } } } if(flag) break; } if(flag==1) printf("Y\n"); else printf("N\n"); } return 0; }
相关文章推荐
- 文档对象模型DOM
- [LeetCode] Smallest Rectangle Enclosing Black Pixels 包含黑像素的最小矩阵
- git merge 和 git rebase 小结
- Android JNI 使用的数据结构JNINativeMethod详解 动态注册JNI
- Js的typeof和Js的基本数据类型
- 雾里看花终隔一层——探析package和import
- OCMOD代码调整系统(Modification System)
- 四则运算2+psp0
- [转]基于四叉树(QuadTree)的LOD地形实现
- Warehouse Management Label Printing Function Setting Up
- 在Windows下运行Make3d
- Building RESTful APIs with Tornado
- jsp的三种java脚本
- Android Studio 快捷键
- ngrep环回接口数据抓取方法,使用-d lo参数
- 伽玛函数
- POJ 1125
- Linux 网络编程 IP协议
- 原创文章000001
- springmvc中RedirectAttributes的作用