问题 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种折纸的售价和库存。
输出
每组数据输出一行,分别为魏好看买到的折纸种类和总数,两个数用空格隔开。
样例输入
3
2 4
1 4
2 1
2 3
1 1
2 1
1 2
3 4
样例输出
2 3 2 2 0 0 好吧这种题专治我这种读题不认真的菜了...#include<stdio.h> #include<algorithm> using namespace std; struct wocao{ int p; int m; }a[1100]; int cmp(wocao x, wocao y) { return x.p<y.p; } int main() { int T,m,n; scanf("%d",&T); while(T--){ scanf("%d%d",&m,&n); for(int i=0;i<m;i++) scanf("%d%d",&a[i].p,&a[i].m); sort(a,a+m,cmp); int sum = 0; int k = 0; for(int i=0;i<m;i++){ if(a[i].m>0){ if(n>=a[i].p){ n-=a[i].p; k++; sum++; } } } for(int i = 0;i < m;i ++){ if((a[i].m-1)>0){ if(n>=a[i].p*(a[i].m-1)){ sum+=a[i].m-1; n-=a[i].p*(a[i].m-1); } else { sum+=n/a[i].p; break; } } } printf("%d %d\n",k,sum); } return 0; }