题目描述
为了在紧张的上班时间让员工们轻松些,百度休息室里放置着按摩椅、 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; }