您的位置:首页 > 其它

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

2012-05-19 15:11 225 查看
题目描述

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

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

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

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

输入格式

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

输出格式

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

输入样例

3

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐