标签:
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 13955 | Accepted: 6851 |
Description
Input
Output
Sample Input
37 29 41 43 47
Sample Output
654
分析:将等式方程左边3、4项移到等号右边,是方程变成一个另外一种等式。
枚举左边打表,枚举右边查表。 或者 枚举右边打表,枚举左边查表。
复杂度:n^3+n^2(logn) 或者 n^2+n^3(logn) 复杂度两者差不多。
代码1:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #include <cmath> #include <iostream> #include <string> #include <queue> #include <stack> #include <vector> #include <algorithm> #define N 100000+100 using namespace std; int f[1000100]; //复杂度=三层枚举打表+两层枚举*二分 //(记得数组要在二层打表的基础上扩大一下 否则访问越界) int B_search(int low, int high, int key) { int mid; while(low<=high) { mid=(low+high)/2; if(f[mid]==key ){ int u=mid-1, v=mid+1; while(f[u]==key) u--; while(f[v]==key) v++; return v-u-1; } else if(f[mid]>key){ high=mid-1; } else low=mid+1; } return 0; } int main() { int a, b, c, d, e; int i, j, k; while(scanf("%d %d %d %d %d", &a, &b, &c, &d, &e)!=EOF) { int cnt=0; for(i=-50; i<=50; i++){ if(i!=0) for(j=-50; j<=50; j++){ if(j!=0) for(k=-50; k<=50; k++){ if(k!=0){ int cur=-c*i*i*i-d*j*j*j-e*k*k*k; f[cnt++]=cur; } } } } sort(f, f+cnt); int ans=0; for(i=-50; i<=50; i++){ if(i!=0){ for(j=-50; j<=50; j++){ if(j!=0){ int cur=a*i*i*i + b*j*j*j; ans=ans+B_search(0, cnt-1, cur); } } } } printf("%d\n", ans ); } return 0; }
代码2:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #include <cmath> #include <iostream> #include <string> #include <queue> #include <stack> #include <vector> #include <algorithm> #define N 100000+100 using namespace std; int f[20000]; //复杂度=两层枚举打表+三层枚举*二分 int B_search(int low, int high, int key) { int mid; while(low<=high) { mid=(low+high)/2; if(f[mid]==key ){ int u=mid-1, v=mid+1; while(f[u]==key) u--; while(f[v]==key) v++; return v-u-1; } else if(f[mid]>key){ high=mid-1; } else low=mid+1; } return 0; } int main() { int a, b, c, d, e; int i, j, k; while(scanf("%d %d %d %d %d", &a, &b, &c, &d, &e)!=EOF) { queue<int>q; while(!q.empty()) q.pop(); //-d*i*i*i-e*j*j*j 全部入队列 int cnt=0; for(i=-50; i<=50; i++){ if(i!=0) for(j=-50; j<=50; j++){ if(j!=0){ int cur=-d*i*i*i-e*j*j*j; f[cnt++]=cur; } } } sort(f, f+cnt); //printf("************\n"); int ans=0; for(i=-50; i<=50; i++){ if(i!=0) for(j=-50; j<=50; j++){ if(j!=0) for(k=-50; k<=50; k++){ if(k!=0){ int cur=a*i*i*i + b*j*j*j + c*k*k*k; ans=ans+B_search(0, cnt-1, cur); } } } } printf("%d\n", ans ); } return 0; }
poj 1840 Eqs 【解五元方程+分治+枚举打表+二分查找所有key 】
标签:
原文地址:http://www.cnblogs.com/yspworld/p/4694151.html