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

2015年百度之星程序设计大赛 - 初赛(2)【题解】

1001.追星族 Accepts: 21 Submissions: 122 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 327...
  • u013368721
  • u013368721
  • 2015年06月02日 16:54
  • 2460

HDU-2017"百度之星"程序设计大赛-初赛(B)-补题

ACM模版昨天没有意识到有比赛,所以错过了,今天早早地就坐在了电脑前等待……但是打了酱油,只签了两道签到题。听说第二道直接 LCA+暴力LCA + 暴力 就能过,愣是没敢写,所以 GGGG 了,第五道...
  • f_zyj
  • f_zyj
  • 2017年08月13日 16:46
  • 857

2015年百度之星程序设计大赛 - 初赛(1) 【题解】

1001.超级赛亚ACMer Accepts: 867 Submissions: 5329 Time Limit: 2000/1000 MS (Java/Others) Memory Li...
  • u013368721
  • u013368721
  • 2015年06月01日 19:13
  • 2234

2017"百度之星"程序设计大赛 - 初赛(A)

1001 统计p - 1的因子个数 #include #include #include #include #include #include #include #include ...
  • sasuke__
  • sasuke__
  • 2017年08月12日 19:54
  • 333

HDU-2017"百度之星"程序设计大赛-初赛(B)-1002-Factory

ACM模版描述题解其实,这个题的题解我是秒出的,当然,之所以没有写是因为这个秒出的题解也是被我秒掉了,我认识他会超时……始终是这样认为的……可是大概数据没有那么刁钻的极限情况,所以直接 LCA+暴力L...
  • f_zyj
  • f_zyj
  • 2017年08月14日 16:52
  • 418

HDU4828 Grids 2014年百度之星程序设计大赛 - 初赛(第一轮) Catalan数

其实这两道题只不过是题目叙述不同而已……题目是
  • KuribohG
  • KuribohG
  • 2014年05月27日 22:32
  • 485

HDU-2017"百度之星"程序设计大赛-复赛-1003-Pokémon GO

ACM模版描述题解这个题一开始,我想着去 OEISOEIS 查查看,也许可以水过,后来发现不行,接着,就发现这个题和 NYOJNYOJ 上的一个题炒鸡一样,除了题面背景不一样外,其他都是一样的。然后就...
  • f_zyj
  • f_zyj
  • 2017年08月18日 16:47
  • 385

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

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

(数学)2017"百度之星"程序设计大赛 - 初赛(A) 1001

题意 现在给定进制P,求有多少个B满足P进制下,一个正整数是B的倍数的充分必要条件是每一位加起来的和是B的倍数。 思路 只要求p-1的因数个数即为所求 比如十进制数ab(两位数,十位为a, 个位为b)...
  • VonSdite
  • VonSdite
  • 2017年08月12日 18:49
  • 390

【 2017"百度之星"程序设计大赛 - 初赛(A)1001小C的倍数问题】

【链接】:http://acm.hdu.edu.cn/showproblem.php?pid=6108 【题目】: 小C的倍数问题 Time Limit: 2000/1000 MS (J...
  • u013050857
  • u013050857
  • 2017年08月12日 22:10
  • 343
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2006百度之星程序设计大赛预赛题目之饭团的烦恼 参考解答
举报原因:
原因补充:

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