2006百度之星程序设计大赛预赛题目之饭团的烦恼 参考解答

原创 2006年05月31日 03:59:00

#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include "math.h"

using namespace std;


struct food
{
    string name;
    int price;
    bool isHun;
    bool isXinla;
};

static int nFoodMenu; //菜单上菜的数目
static int nFoodNeed; //饭团需要点的菜的数目
static int nPeople; //就餐的人数

//荤菜,素菜,辛辣,清淡菜
static int nHunFood;
static int nSuFood;
static int nXinFood;
static int nQindanFood;

vector<food> menu;
vector< vector<food> > chosenMenus;
vector<food> bestMenu;

double Distance15yuan(const vector<food>& chosenMenu)
{   //所选菜与15元相差多少
    // test price
    int totalPrice = 0;
    for(vector<food>::const_iterator iter = chosenMenu.begin(); iter != chosenMenu.end(); ++iter)
    {
        totalPrice += (*iter).price;
    }
    return abs(totalPrice/nPeople - 15); //8折
}

void GetBestMenu()
{
    double priceDistance = 1e+308;
    double thisDistance = 0.0;
    for(vector< vector<food> >::iterator iter = chosenMenus.begin(); iter != chosenMenus.end(); ++iter)
    {
        thisDistance = Distance15yuan(*iter);
        if(thisDistance < priceDistance)
        {
            priceDistance = thisDistance;
            bestMenu = *iter;
        }
    }
}

bool TestCondition(vector<food> chosenFood)
{   //是否符合荤菜,素菜,辛辣,清淡菜数量要求
    int nTestHunFood = 0;
    int nTestSuFood = 0;
    int nTestXinFood = 0;
    int nTestQindanFood = 0;
    for(vector<food>::iterator iter = chosenFood.begin(); iter != chosenFood.end(); ++iter)
    {
        if((*iter).isHun == true)
        {
            ++nTestHunFood;
        }
        else
        {
            ++nTestSuFood;
        }
    }  
    if(nTestHunFood != nHunFood)
    {
        return false;
    }
    if(nTestSuFood != nSuFood)
    {
        return false;
    }

    for(vector<food>::iterator iter = chosenFood.begin(); iter != chosenFood.end(); ++iter)
    {
       
        if((*iter).isXinla == true)
        {
            ++nTestXinFood;
        }
        else
        {
            ++nTestQindanFood;
        }
    }
    if(nTestXinFood != nXinFood)
    {
        return false;
    }
    if(nTestQindanFood != nQindanFood)
    {
        return false;
    }

    return true;
}

void CreateChosenMenus(vector<food>leftFood, vector<food> rightFood)
{
    if(leftFood.size() == nFoodNeed)
    {
        if(TestCondition(leftFood) == true)
        {
            chosenMenus.push_back(leftFood);
        }
        return;
    }

    for(vector<food>::iterator iter = rightFood.begin(); iter != rightFood.end(); ++iter)
    {
        vector<food> newLeftFood(leftFood);
        newLeftFood.push_back(*iter);
        vector<food> newRightFood;
       
        for(vector<food>::iterator i = iter+1; i != rightFood.end(); ++i)
        {
            newRightFood.push_back(*i);
        }
      
        CreateChosenMenus(newLeftFood, newRightFood);
    }   
}

void TryToSolove()
{
    vector<food> left;
    CreateChosenMenus(left, menu);
    GetBestMenu();
}

int main(int argc, char* argv[])
{
    ifstream is(argv[1], ios::in | ios::binary);

    is >> nFoodMenu;
    is >> nFoodNeed;
    is >> nPeople;
    food temp;

    for(int i = 0; i < nFoodMenu; ++i)
    {
        is >> temp.name;
        is >> temp.price;
        is >> temp.isHun ;
        is >> temp.isXinla;
        menu.push_back(temp);
    }
    is >> nHunFood;
    is >> nSuFood;
    is >> nXinFood;
    is >> nQindanFood;
    TryToSolove();
    double averagePrice = 0.0;
    for(vector<food>::iterator iter = bestMenu.begin(); iter != bestMenu.end(); ++iter)
    {
        cout << (*iter).name << endl;
        averagePrice += (*iter).price;
    }
 
    printf("%0.2f/n", averagePrice/nPeople*0.8);

    return 0;
}

2006 年百度之星程序设计大赛初赛题目 1 饭团的烦恼

2006 年百度之星程序设计大赛初赛题目 1  饭团的烦恼 饭团的烦恼 “午餐饭团“是百度内部参与人数最多的民间组织。 同一个部门的,同一间大学的,同一年出生的,用同一种型号电脑的,员工们总...

2006年百度之星程序设计大赛初赛题目1:饭团的烦恼

饭团的烦恼 同一个部门的,同一间大学的,同一年出生的,用同一种型号电脑的,员工们总是以各种理由,各种借口组织各种长久的,临时的饭团。 参加饭团,不仅可以以优惠的价格尝到更加丰富的菜式,还可...

php解:2006 年百度之星程序设计大赛复赛题目 4 ----彩球游戏

2006 年百度之星程序设计大赛复赛题目 4 彩球游戏 X 博士是一个研究儿童智力开发方法的科学家,他为幼儿教育领域做出了许多贡献。最近, X 博士正在研究一种适合儿童的游戏,用以辅助发展儿童的观察力...
  • wxhlxx
  • wxhlxx
  • 2011年06月05日 20:48
  • 819

2006年百度之星程序设计大赛初赛题目2:蝈蝈式的记分

··题目名称:蝈蝈式的记分 ··内容描述:    蝈蝈小朋友刚刚学会了0-9这十个数字,也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只...

2005年百度之星程序设计大赛试题初赛题目-题2

百度之星程序设计大赛试题 -2  第二题(共四题 100 分):重叠区间大小( 20 分)  题目描述:请编写程序,找出下面 “ 输入数据及格式 ” 中所描述的输入数据文件中最大重叠区间的大小。 ...

2005年百度之星程序设计大赛试题初赛题目-题1

第一题(共四题 100 分):连续正整数( 10 分)  题目描述:一个正整数有可能可以被表示为 n(n>=2) 个连续正整数之和,如:  15=1+2+3+4+5  15=4+5+6  15...

2006年百度之星程序设计大赛试题初赛题目-题5-座位调整

题目描述:  百度办公区里到处摆放着各种各样的零食。百度人力资源部的调研发现,员工如果可以在自己喜欢的美食旁边工作,工作效率会大大提高。因此,百度决定进行一次员工座位的大调整。  调整的方法如下:...

php解: 2005年百度之星程序设计大赛试题总决赛题目 ------八方块移动游戏

2005年百度之星程序设计大赛试题总决赛题目题目描述: 八方块移动游戏要求从一个含 8 个数字(用 1-8 表示)的方块以及一个空格方块(用 0 表示)的 3x3 矩阵的起始状态开始,不断移动该空格方...
  • wxhlxx
  • wxhlxx
  • 2011年06月04日 21:45
  • 2112

2006 年百度之星程序设计大赛初赛题目 6 百度语言翻译机

百度语言翻译机 2006 年百度之星程序设计大赛初赛题目 6 百度语言翻译机 时限 1s 百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套他们独特...

2005年百度之星程序设计大赛试题初赛题目

2005年百度之星程序设计大赛试题初赛题目第一题 第一题(共四题 100 分):连续正整数( 10 分)   题目描述:一个正整数有可能可以被表示为 n(n>=2) 个连续正整数之和,如: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2006百度之星程序设计大赛预赛题目之饭团的烦恼 参考解答
举报原因:
原因补充:

(最多只允许输入30个字)