zoukankan      html  css  js  c++  java
  • HDU1203 I NEED A OFFER! 【贪心】

    I NEED A OFFER!

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 15951    Accepted Submission(s): 6331


    Problem Description
    Speakless非常早就想出国,如今他已经考完了全部须要的考试,准备了全部要准备的材料,于是,便须要去申请学校了。要申请国外的不论什么大学。你都要交纳一定的申请费用。这但是非常惊人的。

    Speakless没有多少钱,总共仅仅攒了n万美元。

    他将在m个学校中选择若干的(当然要在他的经济承受范围内)。每一个学校都有不同的申请费用a(万美元),而且Speakless预计了他得到这个学校offer的可能性b。

    不同学校之间是否得到offer不会互相影响。

    “I NEED A OFFER”。他大叫一声。

    帮帮这个可怜的人吧。帮助他计算一下,他能够收到至少一份offer的最大概率。(假设Speakless选择了多个学校,得到随意一个学校的offer都能够)。


     

    Input
    输入有若干组数据,每组数据的第一行有两个正整数n,m(0<=n<=10000,0<=m<=10000)
    后面的m行。每行都有两个数据ai(整型),bi(实型)分别表示第i个学校的申请费用和可能拿到offer的概率。


    输入的最后有两个0。


     

    Output
    每组数据都相应一个输出。表示Speakless可能得到至少一份offer的最大概率。用百分数表示,精确到小数点后一位。
     

    Sample Input
    10 3 4 0.1 4 0.2 5 0.3 0 0
     

    Sample Output
    44.0%
    Hint
    You should use printf("%%") to print a '%'.

    #include <stdio.h>
    #include <algorithm>
    #define maxn 10002
    using namespace std;
    
    struct Node{
    	int w;
    	double v, pos;
    } arr[maxn];
    
    bool cmp(Node a, Node b){
    	return a.pos > b.pos;
    }
    
    int main()
    {
    	int n, m, i;
    	double ans;
    	while(scanf("%d%d", &n, &m), n || m){
    		for(i = 0; i < m; ++i){
    			scanf("%d%lf", &arr[i].w, &arr[i].v);
    			arr[i].pos = arr[i].v / arr[i].w;
    		}
    		sort(arr, arr + m, cmp);
    		ans = 1;
    		for(i = 0; i < m; ++i){
    			if(n >= arr[i].w){
    				n -= arr[i].w;
    				ans *= (1.0 - arr[i].v);
    			}else break;
    		}
    		printf("%.1lf%%
    ", 100.0 * (1 - ans));
    	}
    	return 0;
    }


  • 相关阅读:
    HDU 5213 分块 容斥
    HDU 2298 三分
    HDU 5144 三分
    HDU 5145 分块 莫队
    HDU 3938 并查集
    HDU 3926 并查集 图同构简单判断 STL
    POJ 2431 优先队列
    HDU 1811 拓扑排序 并查集
    HDU 2685 GCD推导
    HDU 4496 并查集 逆向思维
  • 原文地址:https://www.cnblogs.com/llguanli/p/8341056.html
Copyright © 2011-2022 走看看