zoukankan      html  css  js  c++  java
  • 贪心

    题目描述

    有一只老鼠很喜欢奶酪,但是奶酪被分别放在N个房间里,而且这些房间都有一只猫咪看守,现在它准备和猫咪们做个交易。它有M磅的猫食,想用这M磅猫食换取奶酪。在猫咪看守的每一个房间里有奶酪J[i] 磅,同时猫咪需要F[i]磅的食物,如果老鼠给猫咪F[i] * (a)%的猫食,那么它就可以得到J[i] * (a)%的奶酪。现在已知每只猫咪对猫食的需求量和每个房间的奶酪数,那老鼠怎样才能换得最多的奶酪呢?

    输入格式

    第一行输入两个正整数M和N(M和N不大于10000),后面跟N行(每个房间的奶酪数和猫食的需求量)。

    输出格式
    输出老鼠得到的最多的奶酪数,保留三位小数。

    样例
    样例1输入
    5 3
    7 2
    4 3
    5 2
    样例1输出
    13.333
    样例2输入
    20 3
    25 18
    24 15
    15 10
    样例2输出
    31.500

    分析

    典型的贪心,一道性价比问题,即需要在有限的总钱数下得到更高价格的商品,在输入时求出物价,并按从高到低排序即可。

    具体实现

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int MAXN = 10005; 
    
    struct node{
    	double j, f, p;//定义成double更方便
    };
    node a[MAXN];
    int n, m;
    double ans;
    
    bool cmp(node x, node y) {//按性价比从搞到低排序
    	return x.p > y.p;	
    }
    
    int main() {
    	scanf("%d %d", &m, &n);
    	for(int i = 1;i <= n; i++) {
    		scanf("%lf %lf", &a[i].j, &a[i].f);
    		a[i].p = a[i].j / a[i].f;//求性价比
    	}
    	sort(a + 1, a + 1 + n, cmp);
    	for(int i = 1;i <= n; i++) {//统计
    		if(m >= a[i].f) {//如果奶酪没有用完
    			m -= a[i].f;
    			ans += a[i].j;
    		} else {
    			ans += a[i].p * m;
    			break;
    		}
    	}
    	printf("%.3lf
    ", ans);
    	return 0;
    } 
    
  • 相关阅读:
    HashMap
    Java内部类应用——静态内部类
    transient关键字和@Transient 注解
    java基本数据类型传递与引用传递区别
    抽象类
    java collection-list详解
    Arrays,ArrayList,以及ArrayList源码分析
    【转载】【剑指offer】面试题40:最小的 k 个数中的优先级队列
    java stack总结
    java Queue
  • 原文地址:https://www.cnblogs.com/cqbz-ChenJiage/p/13504665.html
Copyright © 2011-2022 走看看