hpu 问题 B: 魏好看买折纸

来源:互联网 发布:sql查询语句选取行 编辑:程序博客网 时间:2024/05/01 01:36

问题 B: 魏好看买折纸

时间限制: 1 Sec 内存限制: 128 MB

题目描述

魏好看在折小红花的过程中,发现自己有折纸的天赋,所以决定去买更多的折纸。她发现商店有各种各样颜色的折纸,魏好看挑不出自己喜欢的种类。

为了能拥有更多颜色的折纸,所以她决定买尽量多种类的折纸。然而魏好看这次又发现自己带的钱不多,所以她想知道在能购买尽量多种类折纸的情况下她最多能买到多少张折纸。

输入

第一行输入一个整数T,代表有T(1<T<1000)组测试数据。

每组数据第一行为两个整数n(0<n<1000),x(0≤n<1000000000),分别代表商店销售的折纸种类和魏好看带的钱数。

下面有n行,第i行有两个整数q(0<a<100000),k(0≤k<100000),分别代表第i种折纸的售价和库存。

输出

每组数据输出一行,分别为魏好看买到的折纸种类和总数,两个数用空格隔开。

样例输入

32 41 42 12 31 12 11 23 4

样例输出

2 32 20 0

思路:注意读题,注意剪枝的应用,简单的贪心问题;#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node {int a;int b;}s[1000+100];int cmp(node x,node y){if(x.a!=y.a)    return x.a<y.a;else return x.b>=y.b;}int main(){int t;scanf("%d",&t);while(t--){int n,x,p1=0,p2=0,i;memset(s,0,sizeof(s));scanf("%d %d",&n,&x);for(i=0;i<n;i++){scanf("%d %d",&s[i].a,&s[i].b);}if(x==0){printf("0 0\n");continue;}sort(s,s+n,cmp);for(i=0;i<n;i++){if(s[i].b){if(x>=s[i].a)    {    x-=s[i].a;    p1++;    p2++;    s[i].b-=1;    }    else    {    break;    }}}for(i=0;i<n;i++){if(s[i].b){if(s[i].a*s[i].b>=x)    {    p2+=(x/s[i].a);    break;    }    else     {    x-=(s[i].a*s[i].b);    p2+=s[i].b;}}}printf("%d %d\n",p1,p2);}return 0;}


3 0
原创粉丝点击