1016.键盘
单点时限: 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;
}
1017.成绩排序
单点时限: 2.0 sec
内存限制: 256 MB
有n (1≤n ≤ 100 )个学生的成绩记录,其中包含学号和成绩两项。
按照成绩从高到低顺序输出成绩及格(> 60 )学生的学号和成绩。成绩相同时按照学号从小到大顺序输出。
输入格式
第1行:输入一个整数 n,表示学生记录数。
第2行~几+1行:每行是学号(11位数字)及成绩(0 到 100之间的整数)。学号和成绩之间有一个空格
输出格式
按要求输出结果,每行输出一个空格分隔的学号及成绩
#include<stdio.h>
#include<stdlib.h>
typedef struct Stu
{
long long int number;
int grade;
}stu;
int cmp1(const void* a, const void* b)
{
stu c = *(stu*)a;
stu d = *(stu*)b;
return c.number - d.number;
}
int cmp2(const void* a, const void* b)
{
/*
*(stu*)a是因为:a是个void *类型,要先
用(stu*)将它转成stu*类型,然后再用*取值,
变成stu类型,才能比较大小。
*/
stu c = *(stu*)a;
stu d = *(stu*)b;
return d.grade - c.grade;
}
int main()
{
int i,j;
long long int temp;
int n;
scanf("%d", &n);
stu sz[1000];
for ( i = 0; i < n; i++)
{
scanf("%lld %d", &sz[i].number,&sz[i].grade);
}
/*
qsort函数参数:
1 待排序数组首地址;
2 数组中待排序元素数量;
3 各元素的占用空间大小, 推荐使用sizeof(s[0])这样, 特别是对结构体;
4 指向函数的指针,用于确定排序的顺序.
注意:如果要对数组进行部分排序, 比如对一个s[n]的数组排列其从s[i]开始的m个元素, 只需要
在第一个和第二个参数上进行一些修改 : qsort(&s[i], m, sizeof(s[i]), cmp);
*/
qsort(sz, n, sizeof(sz[0]), cmp1);
qsort(sz, n, sizeof(sz[0]), cmp2);
for ( i = 0; i < n-1; i++)
{
for ( j = 0; j < n-1-i; j++)
{
if (sz[j].grade == sz[j + 1].grade)
{
if (sz[j].number > sz[j + 1].number)
{
temp = sz[j].number;
sz[j].number = sz[j + 1].number;
sz[j + 1].number = temp;
}
}
}
}
for ( i = 0; i < n;i++)
{
if(sz[i].grade>=60)
printf("%lld %d\n", sz[i].number, sz[i].grade);
}
return 0;
}