所以,我試圖解決的問題:http://codeforces.com/contest/448/problem/D使用二進制搜索找到N * M個乘法表k大數字
BIZON冠軍不只是迷人,他也很聰明。
當我們中的一些人正在學習乘法表時,Bizon冠軍以他自己的方式玩得很開心。 Bizon Champion繪製了一個n×m的乘法表,其中第i行第j列的交點上的元素等於i·j(表格的行和列從1開始編號)。然後他問道:表中第幾個數字是第幾個數字? Bizon冠軍總是立即正確回答。你能重複他的成功嗎?
考慮給定的乘法表。如果以非遞減順序從表格中寫出所有n·m個數字,則您寫出的第k個數字稱爲第k個最大數字。輸入 單行包含整數n,m和k(1≤n,m≤5.105;1≤k≤n·m)。
輸出 在n×m乘法表中打印第k個最大的數字。
我所做的是,我應用二進制搜索從1到n*m
尋找具有k
元素的數字比它少。爲此,我提出以下代碼:
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
ll n,m;
int f (int val);
int min (int a, int b);
int main (void)
{
int k;
cin>>n>>m>>k;
int ind = k;
ll low = 1LL;
ll high = n*m;
int ans;
while (low <= high)
{
ll mid = low + (high-low)/2;
if (f(mid) == k)
ans = mid;
else if (f(mid) < k)
low = mid+1;
else
high = mid-1;
}
cout<<ans<<"\n";
return 0;
}
int f (int val)
{
int ret = 0;
for (int i = 1; i <= n; i++)
{
ret = ret + min(val/i,m);
}
return ret;
}
int min (int a, int b)
{
if (a < b)
return a;
else
return b;
}
不過,我不知道爲什麼,但是這給測試用例錯誤的答案:
input
2 2 2
output
2
我輸出出來是0
我正在學習二分查找,但我不知道我在哪裏出錯這個實現。任何幫助將不勝感激。
這不是關於搜索,第k個最大的數字是從頭開始寫的第k個元素。您可以使用模和標準操作直接計算它。 – Dese
如果您完全找到答案,您需要一個「break」,否則這種情況將會是無限循環。但根據您報告的症狀,這不是唯一的錯誤。 – JSF
@Dese,但你怎麼寫這樣的元素?複雜度將大於O(n^2),並且不會支持給定的限制。 – hans