1. 贪心,其他没啥说的
2. 我的代码:
/* ID: dollar4 PROG: milk LANG: C++ */ #include <iostream> #include <fstream> #include <string> #include <algorithm> #include <cstring> using namespace std; struct Node { int price; int num; } node[5000]; bool cmp(Node a, Node b) { return a.price < b.price; } int main() { ofstream fout ("milk.out"); ifstream fin ("milk.in"); int n, m, i; fin >> n >> m; for (i = 0; i < m; i++) fin >> node[i].price >> node[i].num; sort(node, node + m, cmp); int money = 0, sum = 0, j = 0; while (sum < n) { sum += node[j].num; money += node[j].num * node[j].price; j++; } int rst = money - (sum - n) * node[j-1].price; fout << rst << endl; return 0; }
3. 官方参考代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define MAXFARMER 5000 typedef struct Farmer Farmer; struct Farmer { int p; /* price per gallon */ int a; /* amount to sell */ }; int farmcmp(const void *va, const void *vb) { return ((Farmer*)va)->p - ((Farmer*)vb)->p; } int nfarmer; Farmer farmer[MAXFARMER]; void main(void) { FILE *fin, *fout; int i, n, a, p; fin = fopen("milk.in", "r"); fout = fopen("milk.out", "w"); assert(fin != NULL && fout != NULL); fscanf(fin, "%d %d", &n, &nfarmer); for(i=0; i<nfarmer; i++) fscanf(fin, "%d %d", &farmer[i].p, &farmer[i].a); qsort(farmer, nfarmer, sizeof(farmer[0]), farmcmp); p = 0; for(i=0; i<nfarmer && n > 0; i++) { /* take as much as possible from farmer[i], up to amount n */ a = farmer[i].a; if(a > n) a = n; p += a*farmer[i].p; n -= a; } fprintf(fout, "%d\n", p); exit(0); }