SDUT_迷瘴_貪心

迷瘴

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

 通過懸崖的yifenfei,又面臨着幽谷的考驗——
幽谷周圍瘴氣瀰漫,靜的可怕,隱約可見地上堆滿了骷髏。由於此處長年不見天日,導致空氣中佈滿了毒素,一旦吸入體內,便會全身潰爛而死。
幸好yifenfei早有防備,提前備好了解藥材料(各種濃度的萬能藥水)。現在只需按照配置成不同比例的濃度。
現已知yifenfei隨身攜帶有n種濃度的萬能藥水,體積V都相同,濃度則分別爲Pi%。並且知道,針對當時幽谷的瘴氣情況,只需選擇部分或者全部的萬能藥水,然後配置出濃度不大於 W%的藥水即可解毒。
現在的問題是:如何配置此藥,能得到最大體積的當前可用的解藥呢?
特別說明:由於幽谷內設備的限制,只允許把一種已有的藥全部混入另一種之中(即:不能出現對一種藥只取它的一部分這樣的操作)。

提示:多種藥水混合後的濃度=(濃度1*體積1+濃度2*體積2+……)/(體積和)

 

Input

 輸入數據的第一行是一個整數C,表示測試數據的組數;
每組測試數據包含2行,首先一行給出三個正整數n,V,W(1<=n,V,W<=100);
接着一行是n個整數,表示n種藥水的濃度Pi%(1<=Pi<=100)。

Output

 對於每組測試數據,請輸出一個整數和一個浮點數;
其中整數表示解藥的最大體積,浮點數表示解藥的濃度(四捨五入保留2位小數);
如果不能配出滿足要求的的解藥,則請輸出0 0.00。

Sample Input

31 100 101002 100 2420 303 100 2420 20 30

Sample Output

0 0.00100 0.20300 0.23

Hint

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
	int c,n,v,w;
	int pi[110];
	scanf("%d",&c);
	while(c--){
		scanf("%d%d%d",&n,&v,&w);
		for(int i=0;i<n;i++){
			scanf("%d",&pi[i]);
		}
		sort(pi,pi+n);
		double P=0;  //當前濃度 
		int V=0;     //當前體積
		for(int i=0;i<n;i++){           //關鍵操作 
			if((P*V+pi[i]*v)<=w*(V+v)){
				P=(P*V+pi[i]*v)/(V+v);  //濃度沒有超過 
				V+=v;
			}
			else{
				break;                  //濃度超過了 
			}
		} 
		printf("%d %.2lf\n",V,P/100);   //注意除以100,例如將20化爲0.20 
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章