這題很多萌新一看就說:「簡單,乙個lower_bound解決所有問題。」
#include
#include
#include
using
namespace std;
int num[
100005];
intmain()
cin >> m;
int p1;
while
(m--
)return0;
}
結果…
那麼,到底怎麼回事呢?
第一步,檢查思路。
用lower_bound是沒有問題的,但只用lower_bound就會有漏洞。
舉個例子,看看這個樣例:
32 5 8 1219
正確輸出是8,但用cpp跑一遍就會知道輸出是12。
為什麼呢?
因為lower_bound輸出的是第乙個大於等於要查詢的元素值的位置但是如果最小值出在比它小的呢?這時候就沒有「super_lower_bound",只能對返回值進行特判。
所以首先要設乙個p2,用來存比p1小的值,再來個d1和d2,用來存兩者和x的差,最後來比較兩者誰小,最後來輸出p1或p2所對應的值。這裡又有乙個錯點:直接輸出p1或p2,注意⚠️:我們題要的是值,而非位置!!
成體**如下:
#include
#include
#include
using
namespace std;
int num[
100005];
intmain()
cin >> m;
int p1,p2,d1,d2;
while
(m--)if
(p2 !=-1
)if(d1 < d2)
else
}return0;
}
最後再來總結一下思路:
讀入用lower_bound求出p1
設好p2,d1,d2
求出d1,d2
比較輸出
所以遇到這種題一定要注意,用了lower_bound或upper_bound之後要注意有沒有特殊情況需要特判,才能提高正確率。
祝各位學業進步,馬到成功!
查詢最接近的元素
總時間限制 1000ms 記憶體限制 65536kb 描述在乙個非降序列中,查詢與給定值最接近的元素。輸入第一行包含乙個整數n,為非降序列長度。1 n 100000。第二行包含n個整數,為非降序列各元素。所有元素的大小均在0 1,000,000,000之間。第三行包含乙個整數m,為要詢問的給定值個數...
查詢最接近的元素
在乙個非降序列中,查詢與給定值最接近的元素。input 第一行包含乙個整數n,為非降序列長度。1 n 100000。第二行包含n個整數,為非降序列各元素。所有元素的大小均在0 1,000,000,000之間。第三行包含乙個整數m,為要詢問的給定值個數。1 m 10000。接下來m行,每行乙個整數,為...
查詢最接近的元素
在乙個非降序列中,查詢與蒜頭君的給定值最接近的元素。輸入格式 第一行包含乙個整數 nn,為非降序列長度。1 le n le 1000001 n 100000。第二行包含 nn 個整數,為非降序列各元素。所有元素的大小均在 0 sim1,000,000,0000 1,000,000,000 之間。第三...