这是洛谷上的一道题,原题链接陶陶摘苹果(升级版) - 洛谷
这道题用其他算法比较麻烦,快速排序可以很好解决这一点,当然用冒泡法也可以,不懂快速排序函数的可以看我以前的博客http://t.csdn.cn/tDQXb这里就直接使用
首先输入输出函数等等,可以将苹果的高度和所需要的力气放在一个结构体里,然后将不同的苹果放一个数组中即可
这样就可以将苹果个数,所剩力气大小,每个苹果的高度,所需力气等输入
接下来需要用快速排序将结构体按力气从小到大排序
比较函数(快速排序里面的实现函数)
最后只需要按顺序摘苹果,如果高度足够并且力气足够就可以摘,因为力气是从小到大排列的,不存在其他省力的情况
最后,将完整代码奉上
#include<stdio.h> #include<stdlib.h> struct App { int height_; int strength_; }; scanf_(struct App is[], int x) { int i = 0; for (i = 0; i < x; i++) { scanf("%d%d", &((is+i)->height_),&((is+i)->strength_));//输入每个苹果的‘数据’ } } int compar(const void* p1, const void* p2) { return (((struct App*)p1)->strength_ - ((struct App*)p2)->strength_); } int main() { struct App is[5001] = { 0 }; int s = 0, n = 0; scanf("%d%d", &n, &s); int chair = 0, hand_max = 0; scanf("%d%d", &chair, &hand_max); scanf_(is,n); qsort(is, n, sizeof(is[0]),compar); int i = 0, count = 0; for (i = 0; i < n; i++) { if (chair + hand_max >= is[i].height_) { s -= is[i].strength_; if (s >= 0) count++; } if (s < 0) break; } printf("\n%d", count); return 0; }