引入:找钱问题模板
需要注意的问题:
- 结构体的定义
- 结构体排序
- 计算过程
#include <stdlib.h> // 一定记得引入头文件
struct Node {
int x, y; // x 表示价格,y 表示个数
} a[105];
int cmp(const void * a, const void * b) {
return ((struct Node*)b)->x - ((struct Node*)a)->x; // 返回值 < 0 表示前者应在后者的前面,注意括号
} // 结构体排序函数
qsort(a, n, sizeof(struct Node), cmp); // 第三个参数千万小心填对,尤其是结构体排序,不然可能会导致结果错误
int ans = 0;
for (int i = 0; i < n; i++) {
int t = min(m / a[i].x, a[i].y); // 剩余的钱最多可以买多少个 a[i]
m -= a[i].x * t;
ans += t;
}
例1:混合牛奶
我的解决方案:
#include<stdio.h>
#include<stdlib.h>
const int k = 2000000;
struct Node {
int pi;
int xi;
}Farmer[2000000];
int min(int a, int b) {
if (a >= b) return b;
else return a;
}
int cmp(const void* a, const void* b) {
return ((struct Node*)a)->pi - ((struct Node*)b)->pi;
}
int main() {
int N, M;
scanf("%d %d", &N, &M);
//struct Node Farmer;
for (int i = 0; i < M; i++) {
scanf("%d %d", &Farmer[i].pi, &Farmer[i].xi);
}
qsort(Farmer, M, sizeof(struct Node), cmp);
int ans = 0;
for (int i = 0; i < k; i++) {
ans += Farmer[i].pi * min(Farmer[i].xi, N);
N -= Farmer[i].xi;
if (N <= 0) break;
}
printf("%d", ans);
return 0;
}