搜索题目,只需要两个优化即可,其他的效果并不明显
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;
- }