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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

《算法竞赛进阶指南》0.4二分

發布時間:2023/12/18 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《算法竞赛进阶指南》0.4二分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

102. 最佳牛圍欄

農夫約翰的農場由N塊田地組成,每塊地里都有一定數量的牛,其數量不會少于1頭,也不會超過2000頭。

約翰希望用圍欄將一部分連續的田地圍起來,并使得圍起來的區域內每塊地包含的牛的數量的平均值達到最大。

圍起區域內至少需要包含 F塊地,其中 F會在輸入中給出。

在給定條件下,計算圍起區域內每塊地包含的牛的數量的平均值可能的最大值是多少。

輸入格式
第一行輸入整數 N和 F,數據間用空格隔開。

接下來 N行,每行輸出一個整數,第i+1行輸出的整數代表,第i片區域內包含的牛的數目。

輸出格式
輸出一個整數,表示圍起區域內每塊地包含的牛的數量的平均值可能的最大值乘以1000得到的數值。

數據范圍
1≤N≤100000
1≤F≤N

輸入樣例:
10 6
6
4
2
10
3
8
5
9
4
1

輸出樣例:
6500

#include <iostream> #include <algorithm>using namespace std;const int N = 100010;int n, m; int cows[N]; double sum[N];bool check(double avg) {for(int i = 1; i <= n; i++) sum[i] = sum[i - 1] + cows[i] - avg;double minv = 0;for(int i = 0, j = m; j <= n; j++, i++){minv = min(minv, sum[i]);if(sum[j] >= minv) return true;}return false; }int main() {cin >> n >> m;for(int i = 1; i <= n; i++) cin >> cows[i];double l = 0, r = 2000;while(r - l > 1e-5) //保留3位小數 保留k位小數,取eps = -10^-(k+2) //***這里是r - l,右減左{double mid = (l + r) / 2;if(check(mid)) l = mid; // 這里l r 都可以,把小的干掉就行else r = mid;}printf("%d\n", (int)(r * 1000));return 0; }

113. 特殊排序

有N個元素,編號1.2..N,每一對元素之間的大小關系是確定的,關系不具有傳遞性。

也就是說,元素的大小關系是N個點與N*(N-1)/2條有向邊構成的任意有向圖。

然而,這是一道交互式試題,這些關系不能一次性得知,你必須通過不超過10000次提問來獲取信息,每次提問只能了解某兩個元素之間的關系。

現在請你把這N個元素排成一行,使得每個元素都小于右邊與它相鄰的元素。

你可以通過我們預設的bool函數compare來獲得兩個元素之間的大小關系。

例如,編號為a和b的兩個元素,如果元素a小于元素b,則compare(a,b)返回true,否則返回false。

將N個元素排好序后,把他們的編號以數組的形式輸出,如果答案不唯一,則輸出任意一個均可。

數據范圍
1≤N≤1000

輸入樣例
[[0, 1, 0], [0, 0, 0], [1, 1, 0]]

輸出樣例
[3, 1, 2]

注意:不存在兩個元素大小相等的情況。

// Forward declaration of compare API. // bool compare(int a, int b); // return bool means whether a is less than b.class Solution { public:vector<int> specialSort(int N) {vector<int> res;res.push_back(1);for(int i = 2; i <= N; i++){int l = 0, r = res.size() - 1;while(l < r){int mid = l + r + 1 >> 1;if(compare(res[mid], i)) l = mid; // res[mid] < i, 不在左半邊里else r = mid - 1;}res.push_back(i);for(int j = res.size() - 2; j > r; j --) swap(res[j], res[j + 1]);if(compare(i, res[r])) swap(res[r], res[r + 1]); //i < res[r]}return res;} };

轉載于:https://www.cnblogs.com/wmxnlfd/p/10847657.html

總結

以上是生活随笔為你收集整理的《算法竞赛进阶指南》0.4二分的全部內容,希望文章能夠幫你解決所遇到的問題。

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