3193. 键盘

单点时限: 2.0 sec

内存限制: 256 MB

有一些电脑需要配置键盘,有的电脑只有USB接口,有的只有PS/2接口,而另一些两种接口都有。

现有m个键盘,已知每个键盘的价格和类型。要求如下:1)给尽可能多的电脑配上键盘;2)在满足条件1的情况下,花费尽可能少。

输入格式
第 1 行:整数 T (1≤T≤10) 为问题数。

第一个问题的数据按如下格式输入:

第2行:三个整数a,b,c(0≤a,b,c≤100),分别表示只有USB接口,只有PS/2接口,两种接口都有的电脑台数。

第3行:一个整数m(1≤m≤300),表示现有键盘的个数。

接下来m行,每行有一个整数p表示价格(1≤p≤200)和一个字符串表示键盘的类型,两者之间用一个空格分开。(注意:每行所列的键盘均表示只有1个)

后面问题的数据,格式与第一个问题相同。

输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等);然后在一行中输出两个数字,第一个表示最多可以给多少个电脑配上键盘,第二个表示最少要花多少钱,两者之间用一个空格分开。

样例
input
3
2 1 1
4
5 USB
6 PS/2
3 PS/2
7 PS/2
3 0 3
9
3 USB
8 USB
6 PS/2
16 USB
11 USB
14 PS/2
8 USB
5 PS/2
19 USB
0 5 5
10
3 USB
9 USB
10 PS/2
7 USB
15 PS/2
14 PS/2
12 USB
13 PS/2
3 USB
7 USB
output
case #0:
3 14
case #1:
6 41
case #2:
9 81

/*
思路:先选出来前两种型号,剩下的按照两个综合低价钱买
*/
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int t;
	cin>>t;
	for(int i = 0; i < t; i++) {
		int a,b,c;
		cin>>a>>b>>c;
		int m;
		cin>>m;
		int x[m],y[m],z[m];
		int index1=0;
		int index2=0;
		for(int j = 0; j < m; j++) {
			int price;
			string name;
			cin>>price>>name;
			if(name=="USB") {
				x[index1++]=price;
			} else
				y[index2++]=price;
		}
		sort(x,x+index1);
		sort(y,y+index2);
		int ans=0;
		ans=min(index1,a);
		ans+=min(index2,b);
		int index3=0;
		if(a<index1)
			for(int j = a; j < index1; j++)
				z[index3++]=x[j];
		if(b<index2)
			for(int j = b; j < index2; j++)
				z[index3++]=y[j];
		sort(z,z+index3);
		int sum=0;
		for(int j=0; j<min(index1,a); j++)
			sum+=x[j];
		for(int j=0; j<min(index2,b); j++)
			sum+=y[j];
		for(int j =0; j<min(index3,c); j++)
			sum+=z[j];
		ans+=min(index3,c);
		printf("case #%d:\n",i);
		cout<<ans<<" "<<sum<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值