題解 P4413 【[COCI2006-2007#2] R2】
阿新 • • 發佈:2018-12-09
http false pre clu alt 技術分享 main 是你 tps
這道題你當然可以一遍過
#include<iostream>
using namespace std;
int a,b;
int main()
{
cin>>a>>b;
cout<<b*2-a<<endl;
}
但是你真的這樣寫的話對你個人並沒有任何作用
(而且大佬會覺得你很無腦)
那我們再來看一眼這白給的題面
除了直接輸出$S*2-R1$外,我們還可以嘗試用新的方法去做。
那就是:
#### 二分查找
(這道題用來練手真的很不錯)
因為題目給了數據範圍,那我們就可以在$[-1000,+1000]$這個區間去尋找答案。
bool check(int x) { return (r1+x)/2<s; }
定義一個check函數,當當前答案可行,就返回true,否則返回False。
int so(int l,int r)
{
if(l==r) return l+1;
int mid=(l+r+1)/2;
if(check(mid)) return so(mid,r);//mid可行的話就在右區間搜索
else return so(l,mid-1);
}
這是我們的搜索函數(也就是靈魂)當當前答案可行的話,就在右區間找更優解,否則就轉向左區間。直到不能搜索為止。
附上完整代碼
#include<bits/stdc++.h> using namespace std; int r1,r2,s; bool check(int x) { return (r1+x)/2<s; } int so(int l,int r) { if(l==r) return l+1; int mid=(l+r+1)/2; if(check(mid)) return so(mid,r);//mid可行的話就在右區間搜索 else return so(l,mid-1); } int main() { cin>>r1>>s; cout<<so(-1000,1000)<<endl; return 0; }
最後說一句
WRY is the loveliest person in the world!!!
題解 P4413 【[COCI2006-2007#2] R2】