#inlcude<algorithm>
預設從小到大
不包含
起始指標
結尾指標
排序範圍
有一個陣列a, 要排序a[0]~a[n - 1]
#include<iostream>
#include<algorithm>
using namespace std;
int a[200005];
bool cmp(int a, int b) {
return a > b;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n, cmp);
for (int i = 0; i < n; i++) {
cout << a[i] << ' ';
}
cout << '\n';
}a915
有沒有一個策略可以讓你有在最差情況下,猜的次數最少?
假設要猜的範圍是\(0\)~\(2^{31} - 1\)
最多只需要猜31次!
用數學算算看
每次找搜尋陣列範圍的中間位置
如果他比你的目標大,就往左找
如果他比你的目標小,就往右找
遞迴想法
設函式\(f(l, r, val)\)為整數\(val\)在陣列a[\(l\)~ \(r\)]區間中的位置
#include<iostream>
#include<algorithm>
using namespace std;
int a[200005];
int f(int l, int r, int val) {
if (l == r) {
if (a[l] == val)
return l;
else
return -1;
}
int mid = (l + r) / 2;
if (a[mid] == val)
return mid;
else if (a[mid] > val)
return f(l, mid - 1, val);
else
return f(mid + 1, r, val);
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
int q;
cin >> q;
cout << f(0, n - 1, q) << '\n';
}#include<iostream>
#include<algorithm>
using namespace std;
int a[200005];
int f(int l, int r, int val) {
while (l < r) {
int mid = (l + r) >> 1;
if (a[mid] == val)
return mid;
else if (a[mid] < val)
l = mid + 1;
else
r = mid - 1;
}
if (a[l] == val)
return l;
return -1;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
int q;
cin >> q;
cout << f(0, n - 1, q) << '\n';
}如果直徑i可以,表示為1
如果不行,表示為0
用數列表示可能長這樣
0, 0, 0, 0, 1, 1, 1, 1, 1, 1...
#include <iostream>
#include <algorithm>
using namespace std;
int N, K;
int p[50005];
bool test(int d){
int now, nowpoint = 0;
for(int i = 0; i < K; i++){
now = p[nowpoint];
now+=d;
while(p[nowpoint] <= now){
nowpoint++;
if(nowpoint >= N)
return 1;
}
}
return 0;
}
int main()
{
while(cin >> N >> K){
for(int i = 0; i < N; i++){
cin >> p[i];
}
sort(p, p+N);
int l = 1, r = 1e9;
while(l != r){
int mid = (l + r) / 2;
if(test(mid)){
r = mid;
}else{
l = mid + 1;
}
}
cout<<l<<endl;
}
return 0;
}