2007年百度之星程序设计大赛试题初赛题目-题2-Wii 游戏开始啦!

题目描述 

为了在紧张的上班时间让员工们轻松些,百度休息室里放置着按摩椅、 CD 、高尔夫套装和 Wii 游戏机等休闲用品。其中最受欢迎的当然是游戏机。 

wii 游戏机每个手柄需要使用两节电池(这两个电池可以是不同的品牌)。工程师们在玩游戏时。如果手柄没有电,他们都是将其中没电的电池拿走,并换上一个全新的电池,有电的必须继续使用。 

例如,已知三种电池的使用时间分别为 小时、 小时和 小时。一开始,工程师使用 小时和 小时的电池。 小时后,换上一个 小时的,再过 小时后,手柄再次没电时,已经没有电池可用了。但如果一开始就使用那个 小时电量的电池,可以玩满 个小时。 

告诉你每个品牌电池的使用时间以及该品牌电池的个数,请计算工程师们玩游戏时间的最小值和最大值。 

输入格式 

输入第一行为一个正整数 n ,表示电池的种数。接下来 n 行,每行两个整数 L 和 F ,表示使用时间为 L 的电池有 F 个。 

输出格式 

输出仅一行,包含两个整数,分别表示工程师们的最短游戏时间和最长游戏时间(短的时间在前)。两个整数之间以空格隔开。 

输入样例 

3 2 

5 2 

8 2 

输出样例 

5 8 


my answer:

只能用母函数解出最大值。最小值不知道怎么解

#include <iostream>
#include <algorithm>
using namespace std;

struct node
{
	int time;
	int num;
}lottery[100];
bool cmp(node a, node b)
{
	return a.time < b.time;
}
int Generating(int n, int sum);

int main()
{
	int n, l, f, i, sum, a, b;
	while(cin>>n)
	{
		sum = 0;
		for(i = 0; i < n; i++)
		{
			cin>>lottery[i].time>>lottery[i].num;
			sum = sum + lottery[i].time * lottery[i].num;
		}
		sort(lottery, lottery+n, cmp);
		b = Generating(n, sum);
		cout<<b<<endl;
	}
	return 0;
}

int Generating(int n, int sum)
{
	int c1[1000] = {1};
	int c2[1000] = {0};
	int i, j, k;
	for(i = 0; i < n; i++)
	{
		for(j = 0; j <= sum; j++)
		{
			for(k = 0; k+j<sum&&k<=lottery[i].num*lottery[i].time; k = k + lottery[i].time)
				c2[j+k] = c2[j+k] + c1[j];
		}
		for(j = 0; j <= sum; j++)
		{
			c1[j] = c2[j];
			c2[j] = 0;
		}
	}
	int mid = sum / 4;
	while(mid)
	{
		int temp = 0, cnt;
		for(cnt = 0; cnt < 4; cnt++)
		{
			temp = temp + mid;
			if(temp > sum)
				break;
			while(!c1[temp])
				temp++;
		}
		if(cnt == 4)
			return mid;
		mid--;
	}
	return mid;
}


你可能感兴趣的:(游戏,c,百度)