codeUp 2143: 迷瘴 浮点计算|贪心
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; }?
總結
以上是生活随笔為你收集整理的codeUp 2143: 迷瘴 浮点计算|贪心的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: firework cs4入门
- 下一篇: Nginx初识