!HDU 4334 集合各出一数和为0是否存在-思维、卡时间-(指针的妙用)
来源:互联网 发布:eclipse编译java文件 编辑:程序博客网 时间:2024/06/06 01:53
题意:有5个集合,集合的大小是n,每一个集合出一个数,问能不能找到五个数的和为0。数据范围:T<=50;n<=200
分析:
暴力枚举是n^5*T,超时,那么就要用一些技巧了。
这里有一个指针的妙用:如何在O(n)的复杂度找A,B,使得A+B==C(A,B分别属于一个数列a,b)。做法是先把a,b分别按升序排序,然后一个指针i指向a的首,指针j指向b的尾,判定指针指向的数的和是否==C,若等于则结束查找,若小于,则i++,若大于则 j- -,如果有一个指针已经走到了头还没找到A+B==C,则说明不存在这样的AB;
这个问题再变形:有三个数列a,b,c,如何在O(n^2)的复杂度找A,B,C,使得A+B==C。方法还是上面那个,就是多了一个遍历C的循环。
本题就是用了这个技巧,还用了一点分治的思想吧,其实不是分治,反正我就这样记了,就是说不要题目给的一个问题就想着把这个问题整体的解决,题目说求和,我们不是一定非要一步到位的求和啊,我们可以把求和这个问题分成:a1+a2;a3+a4;a5 求和就是(a1+a2)+(a3+a4)+a5,又因为是找等于0,所以就是:(a1+a2)+(a3+a4)==-a5,这样不就把问题转换成上面的模型了吗。
另外,排序+去重可以用set来做,set.insert()的时候会自动去重并且按升序排序。
代码:
#include<iostream>#include<set>#include<algorithm>using namespace std;set<long long> s1,s2;int t,n;long long a[6][300];long long sum[3][50000];int main(){cin>>t;while(t--){cin>>n;s1.clear();s2.clear();for(int i=0;i<5;i++){for(int j=0;j<n;j++){cin>>a[i][j];}}for(int i=0;i<n;i++){for(int j=0;j<n;j++){s1.insert(a[0][i]+a[1][j]);s2.insert(a[2][i]+a[3][j]);}}for(int i=0;i<n;i++) a[4][i]*=(-1);int len1=0,len2=0;set<long long>::iterator it;for(it=s1.begin();it!=s1.end();it++) sum[1][len1++]=(*it);for(it=s2.begin();it!=s2.end();it++) sum[2][len2++]=(*it);int ok1=0;for(int i=0;i<n;i++){int ok=1;int j=0,k=len2-1;while(sum[1][j]+sum[2][k]!=a[4][i]){if(sum[1][j]+sum[2][k]<a[4][i]) j++;else k--;if(j>=len1||k<0){ok=0;break;}}if(ok){ok1=1;break;}}if(ok1) cout<<"Yes"<<endl;else cout<<"No"<<endl;}}
0 0
- !HDU 4334 集合各出一数和为0是否存在-思维、卡时间-(指针的妙用)
- 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
- 2.3-7 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
- 给定N个整数集合是否存在两个其和刚好为指定常数的元素
- 确定集合中是否存在两个其和刚好为X的元素?
- HDU 5363 元素为1~n的集合有多少个子集的元素和为偶数-思维-(快速幂取模)
- 题目1.请给出一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个证书x时,判断出S中是否存在有两个其和等于x的元素。
- 题目:请给出一个运行时间为Θ(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。
- 判断是否为今年、是否为今天、是否为昨天,比较当前时间和from时间的差值
- 判断是否为今年、是否为今天、是否为昨天,比较当前时间和from时间的差值
- 算法导论 2.3-7 给出一个运行时间为⊙(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素
- 描述一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数 X 时,判断出S中是否存在有两个其和刚好等于 X 的元素。
- 杭电 hdu 5563(计算几何)(思维)(判断是否为五角星)
- 判断集合S中是否存在两个其和等于x的元素
- 算法入门---判断集合S中是否存在两个其和等于x的元素
- 算法入门---判断集合S中是否存在两个其和等于x的元素
- 集合S中是否存在两个元素使它们的和等于另外一个整数
- php判断是否为一维数组--count的妙用
- jquery基本常用函数
- 横版动作游戏
- c++ 11 类成员初始化
- POJ 2231 Moo Volume
- 现存的时间可视化方法
- !HDU 4334 集合各出一数和为0是否存在-思维、卡时间-(指针的妙用)
- 2015 Multi-University Training Contest 4(hdu 5327 - hdu 5338)
- 想起当年自己写的一款游戏
- hdu5325 多校第三场1010
- POJ 3463 Sightseeing
- Handler的使用
- Memento模式
- JavaWeb-常用地址的写法:
- hdu 1247 Hat’s Words 字典树