日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj2976Dropping tests (二分搜索+还是涉及昨天遇见的o1分数规划)

發布時間:2025/4/16 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj2976Dropping tests (二分搜索+还是涉及昨天遇见的o1分数规划) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今年有 n 場 ACM-ICPC 競賽,小明每場都有資格參加。第 i 場競賽共有 b[i] 道題。小明預測第 i 場他能做出 a[i] 道題。為了讓自己看著更“大佬”一些,小明想讓自己平均做出的題數越大越好,也就是最大化大佬度,大佬度的定義如下:
為了達到這個目的,小明決定放棄 k 場比賽的參賽資格。請求出最大的大佬度。
例如有 3 場小型比賽,題數分別是 5 題、1 題、6 題,小明預測自己分別能做出 5 題、0題、2題。如果每場都參加,那么大佬度是 ,看著不怎么大佬。不過,如果放棄第 3 場比賽,那么大佬度就是 ?,看著更加大佬了。
Input
輸入測試文件含有多組測試,每組有 3 行。第一行有 2 個整數, 1 ≤ n ≤ 1000 和 0 ≤ k < n。第二行有 n 個整數,即每個 a[i]。第三行含有 n 個正整數 b[i]。保證 0 ≤ a[i] ≤ b[i] ≤ 1, 000, 000, 000。文件末尾由 n = k = 0 標識,并且不應該被處理。
Output
對于每組測試數據,輸出一行整數,即放棄 k 場比賽后可能的最高大佬度。大佬度應該舍入到最近的整數。
Sample Input
3 1
5 0 2
5 1 6
4 2
1 2 7 9
5 6 7 9
0 0
Sample Output
83
100
Hint

為了避免舍入誤差帶來的二義性,所有答案與除法邊界相差至少 0.001 (例如答案永遠不可能出現 83.4997)。

#include <iostream> #include <algorithm> #include <cstdio> using namespace std; int main() {int n,k;while(scanf("%d%d",&n,&k)&&n){double a[1000],b[1000];for(int i=0;i<n;++i)scanf("%lf",&a[i]);//能做for(int i=0;i<n;++i)scanf("%lf",&b[i]);//有多少double low=0.0,high=100.0,mid,ant;while(high-low>0.00001){double c[1000];ant=0;mid=low+(high-low)/2.0;for(int i=0;i<n;++i)c[i]=a[i]-mid*b[i];sort(c,c+n);for(int i=k;i<n;++i)ant+=c[i];if(ant>0)low=mid;elsehigh=mid;}printf("%.0f\n",mid*100);// cout<<mid<<endl;}return 0; }開始只用了二分搜索,TLE了

#include <iostream> #include <algorithm> #include <cstdio> using namespace std; int main() {int n,k;while(scanf("%d%d",&n,&k)&&n){int a[1000],b[1000];int c[1000];for(int i=0;i<n;++i){scanf("%d",&a[i]);//能做c[i]=i;}for(int i=0;i<n;++i)scanf("%d",&b[i]);//有多少double low=0.0,high=100,mid,ant=0;while(high-low>0.1){mid=low+(high-low)/2.0;do{double aa=0,bb=0,ans;for(int i=0;i<n-k;++i){aa+=a[c[i]];// cout<<c[i]<<' ';}// cout<<endl;for(int i=0;i<n-k;++i)bb+=b[c[i]];ans=100*(1.0*aa/bb)*1.0;if(ans>ant){ant=ans;// cout<<ant<<endl;}}while(next_permutation(c,c+n));if(ant>=mid)low=mid;elsehigh=mid;}printf("%.0lf\n",ant);//cout<<ant<<endl;}return 0; }




總結

以上是生活随笔為你收集整理的poj2976Dropping tests (二分搜索+还是涉及昨天遇见的o1分数规划)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。