1. 程式人生 > >JZOJ 4230. 淬煉神體 (Standard IO)

JZOJ 4230. 淬煉神體 (Standard IO)

printf script sam 數量 spa 擔心 ear des 大於等於

題目

Description

王仙女將你提供的答案填在《葵花寶典》上,突然,寶典發出耀眼的白光,一股強大的吸力瞬間將仙女吸入寶典中。
一陣眩暈過後,仙女發現自己來到了一個浮島上,四周的半空中也有許多大小不一的浮島,他擡頭一看,空中浮現著這樣一句話:欲要成神,必先成就神體。每座浮島都有一定的淬煉肉體的功效,但你只能選擇恰好K座來淬煉你的肉體。最終你的神體有多強,就看你的造化了。
仙女看了看手中的寶典,發現上面浮現著這些浮島的信息,每座浮島上有兩個數字。仙女研究了一會兒終於明白了,原來,每來到一座浮島,你就會由這座島上的神雷淬煉肉體,得到a點淬煉值,但是這種淬煉方法對身體又有一定的傷害,於是你會受到b點損傷值。而最後你的神體強度恰好為你得到的淬煉值之和與你受到的損傷值之和的比值。即神體強度=(∑a)/(∑b)。同時,你不能選擇一座浮島兩次。你不必擔心仙女如何到達其它的島,寶典擁有將他傳送至任何一座島的能力。
現在,仙女想知道,他有可能淬煉出的神體的最大強度是多少。他把這個問題交給了未來的你作為剛剛幫助過他的答謝。

Input

第一行包含兩個整數N,K,分別表示浮島的數量(不包括仙女所在的浮島)和仙女可以選擇的浮島數,浮島的編號為1~N
第二行包含N個整數,第i個數為編號為i的浮島的淬煉值a
第二行包含N個整數,第i個數為編號為i的浮島的損傷值b

Output

一個實數,為仙女有可能淬煉出的神體的最大強度,保留三位小數。

Sample Input

3 2
5 7 1
4 3 2

Sample Output

1.714

Data Constraint

對於30%的數據,2≤K≤N≤10,1≤a,b≤5
對於100%的數據,2≤K≤N≤100000,1≤a,b≤1000

分析

考試的時候 打了個暴力和貪心 30,20;

正解:

a[i]/b[i]=ans;

a[i]-b[i]*ans=0;

所以只要右邊大於等於0就可以一個符合的答案

我們用二分枚舉ans,註意精度4位

代碼

 1 #include<iostream>
 2
#include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 double a[100001],b[100001],c[100001]; 7 bool cmp(double a,double b) 8 { 9 return a>b; 10 } 11 int main () 12 { 13 int n,k; 14 scanf("%d %d",&n,&k); 15 for (int i=1;i<=n;i++) 16 scanf("%lf",&a[i]); 17 for (int i=1;i<=n;i++) 18 scanf("%lf",&b[i]); 19 double l=0.001,r=1000,mid,mb; 20 while (r-l>0.0001) 21 { 22 mid=(l+r)/2.0; 23 for (int i=1;i<=n;i++) 24 c[i]=a[i]-b[i]*mid; 25 sort(c+1,c+1+n,cmp); 26 double mb=0; 27 for (int i=1;i<=k;i++) 28 mb+=c[i]; 29 if (mb>=0) l=mid; 30 if (mb<0) r=mid; 31 } 32 printf("%.3lf",l); 33 }

JZOJ 4230. 淬煉神體 (Standard IO)