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;
}

浙公网安备 33010602011771号