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;}
};