1、贪心算法 2、优化解:读入数据时将相同价格合并,计算时不需排序。 /* ID: gengjia1 LANG: C TASK: milk */ #include <stdio.h> #include <stdlib.h> //#define NDEBUG #include <assert.h> int N, M; struct FARMER{ int price; int amount; }; int farmercmp(const void *fa, const void *fb) { struct FARMER *a, *b; a = (struct FARMER *)fa; b = (struct FARMER *)fb; if(a->price > b->price) return 1; if(a->price < b->price) return -1; return 0; } int main(void) { FILE *fin = fopen ("milk.in", "r"); FILE *fout = fopen ("milk.out", "w"); struct FARMER *F; int price = 0; int ca = 0; int i; fscanf (fin, "%d", &N); assert(N >= 0); assert(N <= 2000000); fscanf (fin, "%d", &M); assert(M >= 0); assert(M <= 5000); F = (struct FARMER *)malloc(M * sizeof(struct FARMER)); for(i = 0; i < M; i++) { fscanf(fin, "%d %d", &F[i].price, &F[i].amount); } qsort(F ,M, sizeof(struct FARMER), farmercmp); for(i = 0; i < M && ca < N; i++) { ca += F[i].amount; price += F[i].price * F[i].amount; } if(ca > N) { price -= (ca - N) * F[--i].price; } fprintf(fout, "%d/n", price); fclose(fin); fclose(fout); exit(0); }