cowcycle[USACO]
这道题很抱歉,基本谈不上算法,暴力搜索过了(测试数据比较简单..)。唯一的收获就是把方差这个东西又捡起来好好复习了一下。
注意:极差(最小和最大值的差)和方差的大小没有因果关系。
代码如下:
/* ID: zhangyc1 LANG: C++ TASK: cowcycle */ #include <fstream> #include <iostream> #include <cstdlib> #include <cstring> using namespace std; ofstream fileout("cowcycle.out"); double arrPartRatio[10], arrRatio[50], arrTempDb[50]; double arrDif[50]; int nRatioArrSize = 0; int arrForw[5], arrBackw[10], F, B; int arrAnsF[5], arrAnsB[10]; int F1, F2, R1, R2; double dbMin = 12800.0; void dfsB(int nLeft, int nDepth); void dfsF(int nLeft, int nDepth); // 归并排序 void MergeSort() { int i = 0, j = 0, nCur = 0; while (i < nRatioArrSize && j < B) { if (arrRatio[i] < arrPartRatio[j]) { arrTempDb[nCur++] = arrRatio[i]; i++; } else { arrTempDb[nCur++] = arrPartRatio[j]; j++; } } if (i < nRatioArrSize) { memcpy(arrTempDb + nCur, arrRatio + i, (nRatioArrSize - i)*sizeof(double)); } if (j < B) { memcpy(arrTempDb + nCur, arrPartRatio + j, (B - j)*sizeof(double)); } memcpy(arrRatio, arrTempDb, sizeof(arrTempDb)); } void CalVar() { nRatioArrSize = 0; for (int i = 0; i < F; i++) { for (int j = 0; j < B; j++) { arrPartRatio[j] = (double)arrForw[i] / arrBackw[B - 1 - j]; } MergeSort(); nRatioArrSize += B; } // 排序完成,计算方差 double avg = 0.0, avgSquare = 0.0; for (int i = 1; i < nRatioArrSize; i++) { arrDif[i - 1] = arrRatio[i] - arrRatio[i - 1]; avg += arrDif[i - 1]; avgSquare += arrDif[i - 1] * arrDif[i - 1]; } avg /= (nRatioArrSize - 1); double rs = avgSquare / (nRatioArrSize - 1) - avg * avg; if (rs < dbMin) { dbMin = rs; memcpy(arrAnsF, arrForw, sizeof(arrForw)); memcpy(arrAnsB, arrBackw, sizeof(arrBackw)); } } void prepairData() { ifstream filein("cowcycle.in"); filein >> F >> B >> F1 >> F2 >> R1 >> R2; filein.close(); } void dfsF(int nLeft, int nDepth) { if (nDepth == F) { if (arrForw[F - 1] * R2 < arrForw[0] * R1 * 3) return; // 此时至少存在一个满足3倍条件的搜索 dfsB(R1, 0); } else { for (int i = nLeft; i <= F2 - F + 1 + nDepth; i++) { arrForw[nDepth] = i; dfsF(i + 1, nDepth+1); } } } void dfsB(int nLeft, int nDepth) { if (nDepth == B) { if (arrForw[F - 1] * arrBackw[B - 1] < arrForw[0] * arrBackw[0] * 3) return; CalVar(); } else { for (int i = nLeft; i <= R2 - B + 1 + nDepth; i++) { arrBackw[nDepth] = i; dfsB(i + 1, nDepth+1); } } } void process() { dfsF(F1, 0); fileout << arrAnsF[0]; for (int i = 1; i < F; i++) { fileout << " " << arrAnsF[i]; } fileout << endl; fileout << arrAnsB[0]; for (int i = 1; i < B; i++) { fileout << " " << arrAnsB[i]; } fileout << endl; } int main(){ prepairData(); process(); fileout.close(); return 0; }