您的位置:首页 > 其它

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

2012-05-16 22:05 246 查看
饭团的烦恼

“午餐饭团“是百度内部参与人数最多的民间组织。

同一个部门的,同一间大学的,同一年出生的,用同一种型号电脑的,员工们总是以各种理由,各种借口组织各种长久的,临时的饭团。

参加饭团,不仅可以以优惠的价格尝到更加丰富的菜式,还可以在吃饭的时候和同事们唠唠嗑,吹吹水,增进感情。

但是,随着百度的员工越来越多,各个饭团的管理随即变得烦杂。特别是为了照顾员工们越来越挑剔的胃口,饭团的点菜负责人背负的责任越来越大。现在,这个重担落在百度之星的肩上,因为,你们将要为所有的百度饭团设计一个自动点菜的算法。

饭团点菜的需求如下:

1 . 经济是我们要考虑的一个因素,既要充分利用百度员工的午餐补助,又不能铺张浪费。因此,我们希望最后的人均费用越接近 12 元越好。

2 . 菜式丰富是我们要考虑的另一个因素。为简单起见,我们将各种菜肴的属性归结为荤菜,素菜,辛辣,清淡,并且每个菜只能点一次。

3 . 请紧记,百度饭团在各大餐馆享受 8 折优惠。

输入数据描述如下:

第一行包含三个整数 N , M , K ( 0<N<=16 , 0<M<=N , 0<K<=12 ),分别表示菜单上菜的数目,饭团需要点的菜的数目,就餐的人数。

紧接着 N 行,每行的格式如下:

菜名(长度不超过 20 个字符) 价格(原价,整数) 是否荤菜( 1 表示是, 0 表示否) 是否辛辣( 1 表示是, 0 表示否)

例:

水煮鱼 30 1 1

紧接着是 a b c d 四个整数,分别表示需要点的荤菜,素菜,辛辣,清淡菜的数目。

输出数据:

对于每一测试数据,输出数据包含 M+1 行,前 M 行每行包含一个菜名(按菜名在原菜单的顺序排序)。第 M+1 行是人均消费,结果保留两位小数。

说明:

1 .结果菜单的数目应该恰好为 M ,荤菜,素菜,辛辣,清淡菜的数目恰好为 a , b , c , d 。在满足这样的前提下,选择人均消费最接近 12 元的点菜方案。题目数据保证有且仅有一个解。

2 .每组测试数据的结果用一个空行隔开。末尾不要有多余的空行。

输入样例

3 2 2

水煮鱼 30 1 1

口水鸡 18 1 1

清炖豆腐 12 0 0

1 1 1 1

输出样例

口水鸡

清炖豆腐

12.00

时间要求: 1S 之内

my answer:

用的是DFS,一点小小的剪枝,不知道时间够不够,也没有试过很多测试数据,不知道有没有BUG

题目给的信息有一些冗余,不知道要不要验证

为什么便于调试,使用了习惯的while()循环输入,不知道正式比赛应该怎么写

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

struct node
{
	string name;
	int price;
	bool meat;
	bool hot;
};
node food[18];
int answer, target, n, m, k;
int ans[18],temp[18];
bool flag;
void dfs(int ceil, int price, int a, int b, int c, int d, int cnt);
int main()
{
	int i, a, b, c, d;
	while(cin>>n>>m>>k)
	{
		flag = 0;
		for(i = 0; i < n; i++)
			cin>>food[i].name>>food[i].price>>food[i].meat>>food[i].hot;
		cin>>a>>b>>c>>d;
		target = 15 * k; answer = 0;
		dfs(0, 0, a, b, c, d, 0);
		for(i = 0; i < m; i++)
			cout<<food[temp[i]].name<<endl;
		if(flag)
			cout<<"12.00"<<endl;
		else
			cout<<setiosflags(ios::fixed)<<setprecision(2)<<(double)answer * 0.8 / k<<endl;
	}
	return 0;
}

void dfs(int ceil, int price, int a, int b, int c, int d, int cnt)
{
	int i;
	if(flag)return;
	if(cnt == m)
	{
		if(abs(price-target) < abs(answer-target))
		{
			answer = price;
			for(i = 0; i < m; i++)
				temp[i] = ans[i];
		}
		if(answer == target)
			flag = 1;
	}
	else if(cnt > m)return;
	else if(price-target > abs(answer-target))
		return;
	if(ceil >= n)
		return;
	for(i = ceil; i < n; i++)
	{
		if(food[i].meat && food[i].hot && a && c)
		{
			ans[cnt] = i;
			dfs(i+1, price+food[i].price, a-1, b, c-1, d, cnt+1);
		}
		if(flag)return;
		if(food[i].meat && !food[i].hot && a && d)
		{
			ans[cnt] = i;
			dfs(i+1, price+food[i].price, a-1, b, c, d-1, cnt+1);
		}
		if(flag)return;
		if(!food[i].meat && food[i].hot && b && c)
		{
			ans[cnt] = i;
			dfs(i+1, price+food[i].price, a, b-1, c-1, d, cnt+1);
		}
		if(flag)return;
		if(!food[i].meat && !food[i].hot && b && d)
		{
			ans[cnt] = i;
			dfs(i+1, price+food[i].price, a, b-1, c, d-1, cnt+1);
		}
		if(flag)return;
	}
	return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐