2143: 迷瘴
時間限制: 1 Sec 內存限制: 32 MB
提交: 666 解決: 201
[提交][狀態][討論版][命題人:外部導入]
題目描述
小明正在玩遊戲,他控制的角色正面臨着幽谷的考驗——
幽谷周圍瘴氣瀰漫,靜的可怕,隱約可見地上堆滿了骷髏。由於此處長年不見天日,導致空氣中佈滿了毒素,一旦吸入體內,便會全身潰爛而死。
幸好小明早有防備,提前備好了解藥材料(各種濃度的萬能藥水)。現在只需按照配置成不同比例的濃度。
現已知小明隨身攜帶有n種濃度的萬能藥水,體積V都相同,濃度則分別爲Pi%。並且知道,針對當時幽谷的瘴氣情況,只需選擇部分或者全部的萬能藥水,然後配置出濃度不大於 W%的藥水即可解毒。
現在的問題是:如何配置此藥,能得到最大體積的當前可用的解藥呢?
特別說明:由於幽谷內設備的限制,只允許把一種已有的藥全部混入另一種之中(即:不能出現對一種藥只取它的一部分這樣的操作)。
輸入
輸入數據的第一行是一個整數C,表示測試數據的組數;
每組測試數據包含2行,首先一行給出三個正整數n,V,W(1<=n,V,W<=100);
接着一行是n個整數,表示n種藥水的濃度Pi%(1<=Pi<=100)。
輸出
對於每組測試數據,請輸出一個整數和一個浮點數;
其中整數表示解藥的最大體積,浮點數表示解藥的濃度(四捨五入保留2位小數);
如果不能配出滿足要求的的解藥,則請輸出0 0.00。
樣例輸入
2 1 35 68 1 2 79 25 59 63
樣例輸出
35 0.01 0 0.00
題意就是混合多個體積相同的濃度不同的藥水 要求混合後濃度不超過W%的最大體積下和最大體積下的濃度
分析:開始想複雜了 每次混合都是整個體積的藥水進行混合 所以必定是全部混合起來 不必考慮部分體積
那麼爲了使濃度儘可能小 體積儘可能大 我們不妨貪心 按照濃度排序 從小到大 把藥水混合起來 濃度也隨之更新
如果藥水中濃度最小的就大於那個W那麼直接輸出“0 0.00”
否則我們就貪心混合 然後輸出結果
需要注意的就是浮點數百分比下的溶質數和非百分比下的溶質數要區分清楚
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<cmath>
#include<algorithm>
#include<set>
#include<vector>
#include<climits>
#define Morethan(a,b) ((a)>((b)+eps))
using namespace std;
typedef long long ll;
const double eps = 1e-5;
const ll mod = 1000000007;
const int maxn = 100010;
int p[110];
int main(){
int n;
scanf("%d",&n);
while(n--){
int n,v,w;
scanf("%d%d%d",&n,&v,&w);
int Min = 110;
for(int i=1;i<=n;i++){
scanf("%d",&p[i]);
Min = min(Min,p[i]);
}
if(Min>w){
printf("0 0.00\n");
continue;
}
sort(p+1,p+1+n,less<int>());
double ansz=0.01*v*p[1];
int anst=v,cnt=1;
for(int i=2;i<=n;i++){
double rz = 0.01*v*p[i];//計算當前藥水溶質
double nowW = ((rz+ansz))/(anst+v);//計算混合後藥水濃度(無%號)
if(Morethan(nowW*100.0,w))break;//如果濃度超標 就不混合了
anst+=v;//體積增大
ansz = nowW*anst;//溶質容量更新
cnt++;
}
double W = ansz/anst*100.0;//濃度要輸出百分比的值才行
、
printf("%d %.2f\n",anst,round(W)/100.0);
}
return 0;
}