HDU1009

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct room {
    int J;
    int F;
    double rate;
}r[1010];

int sizer = sizeof(r[0]);

int cmp(const void *a, const void *b)
{
    struct room *c = (room *)a;
    struct room *d = (room *)b;
    return (c->rate > d->rate) ? -1 : 1;     ///注意double会有误差,不能简单写成return d->date - c->rate
}

int main()
{
#if 0
    freopen("data.in", "r", stdin);
    freopen("data.out", "w", stdout);
#endif // 1
    int M, N, i;
    double maxx;
    while (~scanf("%d%d", &M, &N)) {
        if (M == -1 && N == -1) break;
        for (i = 0; i < N; i++) {
            scanf("%d%d", &r[i].J, &r[i].F);
            r[i].rate = 1.0 * r[i].J / r[i].F;     ///计算比例,注意类型转换,否则int自动取整
        }
        maxx = 0;


        qsort(r, N, sizer, cmp);   ///按比例进行结构体排序

        for (i = 0; i < N; i++) {
            if (r[i].F == M) {         ///分情况讨论取多少JavaBean,不要忘记break跳出
                maxx = maxx + (double)r[i].J;
                break;
            }
            if (r[i].F > M) {
                maxx = maxx + r[i].rate * (double)M;
                break;
            }
            if (r[i].F < M) {
                maxx = maxx + (double)r[i].J;
                M = M - r[i].F;
            }
        }

        printf("%.3f\n", maxx);
    }
    return 0;
}

贪心算法,先将数据存入结构体数组,并计算JavaBean与猫粮的比例。按照此比例从大到小用qsort结构体排序(注意辅助函数cmp的判断条件,不能简单地写成d->rate - c->rate,浮点数会有误差)。重点是在遍历结构体数组时的判断标准,分情况讨论。细节方面主要注意int和double之间计算的类型转换,还有喜欢用重定向调试的小伙伴千万不要忘了把条件编译置为0,我此题一个WA就是这么来的,也是醉了。


你可能感兴趣的:(排序,ACM,贪心,hduoj)