hdu 4334 Trouble 枚举。。。。
2013-08-07 17:46
274 查看
题意很容易,给你5个集合,问你有没有可能在每一个集合里面找1个数,然后把5个数加起来等于0
首先想到的是把4个n的集合合并成2个n^2的集合,然后 枚举其中一个n^2的集合和剩下的一个n的集合,在另一个n^2的集合里二分查找-sum是否存在,复杂度为 O(n^3)*log(n^2),
恭喜……超时。。。
赛后在网上看到另一种查找方式。。。。自己看吧。
首先想到的是把4个n的集合合并成2个n^2的集合,然后 枚举其中一个n^2的集合和剩下的一个n的集合,在另一个n^2的集合里二分查找-sum是否存在,复杂度为 O(n^3)*log(n^2),
恭喜……超时。。。
赛后在网上看到另一种查找方式。。。。自己看吧。
#include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<iostream> #include<cstdlib> using namespace std; long long a[6][205]; long long sum1[40010]; long long sum2[40010]; int n,top1,top2; int main() { int cas; scanf("%d",&cas); while(cas--) { scanf("%d",&n); for(int i=1;i<=5;i++) { for(int j=1;j<=n;j++) { scanf("%I64d",&a[i][j]); } } top2=1,top1=1; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { sum2[top2++]=a[4][i]+a[5][j]; sum1[top1++]=a[1][i]+a[2][j]; } } top2--; top1--; sort(sum1+1,sum1+1+top1); sort(sum2+1,sum2+1+top2); sort(a[3]+1,a[3]+n+1); int flag=0; for(int i=1;i<=n;i++) { int j=1,k=top2; while(j<=top1&&k>=1) //关键…… { if(sum1[j]+sum2[k]+a[3][i]==0) { flag=1; break; } else if(sum1[j]+sum2[k]+a[3][i]>0) k--; else j++; } if(flag) break; } printf("%s\n",flag?"Yes":"No"); } return 0; }
相关文章推荐
- 枚举+贪心 hdu-4334-Trouble
- hdu 4334 Trouble
- hdu 4334 Trouble(两个数组寻找目标和)
- HDU 4334 Trouble
- HDU4334——贪心(卡二分)——Trouble
- HDU 4334 Trouble
- HDU 4334 Trouble
- hdu 4334 Trouble
- HDU - 4334 Trouble(贪心|哈希)
- Trouble&&http://acm.hdu.edu.cn/showproblem.php?pid=4334
- HDU 4334 Trouble (暴力)
- HDU 4334 Trouble (暴力)
- hdu 4334 Trouble
- HDU 4334 Trouble
- hdu 4334 Trouble (分治缩小复杂度)
- hdu 4334 Trouble
- HDU 4334 Trouble [二分哈希]
- HDU 4334 - Trouble
- hdu 4334 Trouble 排序+优化 多校联合赛(四)第四题
- HDU 4334 & BNU 126130 -- Trouble