搜索题目,只需要两个优化即可,其他的效果并不明显
1)因为递归搜索出的数列是有序的,所以将分子升序,分母降序排列后,再按顺序相除,得到的数列将“较为有序”,采用插入排
序比较好,因为c++的sort函数在数组小的时候会自动insert_sort(),所以还是可以用sort的。这个优化是这道题目的关键!
2)计算方差可以采用 D(x) = E(x*x) - E(x)*E(x)
这道题目花了很长时间,总结如下:
1)对于搜索最终更新答案的函数要尽量优化,对较为有序的数列排序,速度很快
2)当遇到像编译器错误的问题时,一般是数组大小没开够,或者开错了,这次就是把ans[2][N]写成了ans[N][2]导致错误
- #include <iostream>
- #include <algorithm>
- #include <map>
- #include <vector>
- using namespace std;
- /*
- PROG: cowcycle
- LANG: C++
- ID: heben991
- */
- const int N = 60;
- int f[N], r[N], F, R, f1, f2, r1, r2;
- int ans[2][N];
- double a[N], mini=1e15;
- void update()
- {
- double mean=0, vari=0, t;
- int i, j, k=0, p;
- for(i = 1; i <= F; ++i)
- for(j = R; j >= 1; --j)
- {
- t = (double)f[i]/r[j];
- a[++k] = t;
- }
- sort(a+1,a+k+1);
- --k;
- for(i = 1; i <= k; ++i)
- {
- a[i]=a[i+1]-a[i];
- mean += a[i];
- vari += a[i]*a[i];
- }
- mean /= k;
- vari = vari/k - mean*mean;
- if(vari < mini)
- {
- mini = vari;
- memcpy(ans[0], f+1, F*sizeof(int));
- memcpy(ans[1], r+1, R*sizeof(int));
- }
- }
- void dfs_rear(int k, int low)
- {
- if(k > R)
- {
- int i, j;
- if( f[F]*r[R] < 3*f[1]*r[1] ) return;
- update();
- }
- else
- {
- for(r[k] = low; r[k]-R+k <= r2; ++r[k])
- {
- dfs_rear(k+1,r[k]+1);
- }
- }
- }
- void dfs_front(int k, int low)
- {
- if(k > F)
- {
- dfs_rear(1, r1);
- }
- else
- {
- for(f[k] = low; f[k]-F+k <= f2; ++f[k])
- {
- dfs_front(k+1, f[k]+1);
- }
- }
- }
- int main()
- {
- int i, j, k, t, h;
- freopen("cowcycle.in", "r", stdin);
- freopen("cowcycle.out","w",stdout);
- scanf("%d%d%d%d%d%d", &F,&R,&f1,&f2,&r1,&r2);
- dfs_front(1, f1);
- printf("%d", ans[0][0]);
- for(i = 1; i < F; ++i) printf(" %d", ans[0][i]);
- puts("");
- printf("%d", ans[1][0]);
- for(i = 1; i < R; ++i) printf(" %d", ans[1][i]);
- puts("");
- return 0;
- }
本文介绍了一种通过优化排序和计算方差来提高搜索算法效率的方法。关键在于递归搜索后采用插入排序,并使用特定公式计算方差,以找到最优解。
1103

被折叠的 条评论
为什么被折叠?



