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

  

posted @ 2013-03-20 15:58  J.Z's World  阅读(158)  评论(0编辑  收藏  举报