EOJ1016-1017

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;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值