高效算法设计专项:UVa 10125
来源:互联网 发布:网络运营商自动选择 编辑:程序博客网 时间:2024/05/16 17:51
暴力枚举显然会TLE。Lrj书里介绍了中途相遇法,用map实现了一下,就是先用O(n^2)建立一个a+b到一个整数的映射,然后再用O(n^2)枚举d-c就可以在O(n^2)复杂度下解决该问题了。需要注意的是a、b、c、d不能重复,这里我用map<int,vector<int>>实现以判重。只不过具体代码比较丑……
#include <iostream>#include <fstream>#include <cstring>#include <cstdio>#include <map>#include <algorithm>#include <vector>using namespace std;#define M 1010int n;int a[M];map<int,vector<int> > table;int judge(int a,int b){ int a1=a/2000,a2=a%2000; int b1=b/2000,b2=b%2000; if(a1==b1) return 0; if(a1==b2) return 0; if(a2==b1) return 0; if(a2==b2) return 0; return 1;}int main(){ freopen("in.txt","r",stdin); while(cin>>n) { if(!n) break; table.clear(); for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) { table[a[i]+a[j]].push_back(i*2000+j); } int ans=1<<30; for(int i=n-1;i>=0;i--) { for(int j=i-1;j>=0;j--) { int tmp=a[i]-a[j]; if(table.count(tmp)) { for(int k=0;k<table[tmp].size();k++) { if(judge(i*2000+j,table[tmp][k])) { ans=a[i]; break; } } } if(ans!=1<<30) break; } if(ans!=1<<30) break; } if(ans==1<<30) cout<<"no solution"<<endl; else cout<<ans<<endl; } return 0;}
- 高效算法设计专项:UVa 10125
- 高效算法设计专项:UVa 10391
- 高效算法设计专项:UVa 10810
- 高效算法设计专项:UVa 10730
- 高效算法设计专项:UVa 10535
- 高效算法设计专项:UVa 11054
- 高效算法设计专项:UVa 11572
- 高效算法设计专项:UVa 10827
- 高效算法设计专项:UVa 10691
- 高效算法设计专项:LA 2689
- 高效算法设计专项:LA 4726
- 高效算法设计专项:LA 2963
- 高效算法设计专项:LA 4356
- [高效算法设计]Calculator conundrum Uva 11549
- ( 设计高效算法 ) 年龄排序 Age Sort Uva 11462
- 【高效算法设计——等价转换】UVa 11054
- 【高效算法设计——二分法】UVa 1607 Gates
- 【高效算法设计——滑动窗口】 UVa 12174 Shuffle
- 开源项目之TOK REEC (C语言正则表达式)
- 2013清明节 我会永远记住这一天
- Ubuntu 12.04 Eclipse 安装 SVN插件
- 《学习OpenCV》练习题第四章第四题
- win7下面VMware的centos实现无线上网
- 高效算法设计专项:UVa 10125
- 2012微软暑期实习笔试题
- 解决putty终端中显示linux系统中C编程使用curses中文乱码的问题
- android邮件系统开发的基础知识
- Robotlegs框架
- Win7+Win8双系统安装教程!零风险超简单2
- 打印zigzag矩阵 威盛笔试题
- sed + grep 命令
- 礼物:《红孩儿引擎内功心法修练与Cocos2d-x》之结点系统(场景,层,精灵)