題目鏈結
自動刷題機tt(蒟蒻也好想擁有),可惜目前不存在,留著給以後的oier發明吧;
這是本蒟蒻第一次做shoi,發現是道好水的藍題
題目大意就是讓你求乙個最小值n和乙個最大值n滿足題意能恰好a掉k題;
我們會發現 當n越大的時候 a掉的題目會越少(這很顯然吧,想想看寫個巨長的**,直接交不是很難a成功
當然和題目不是乙個意思扯偏了)
反之亦然,也就是這道題是滿足單調性的;
首先我們肯定會想到暴力,直接列舉n很顯然會超時
那麼既然滿足單調性,我們自然就想到二分答案
我們可以用乙個check函式來判斷,check(x)表示當n=check的時候我們能做幾題呢
對於求最小值n而言
當check(mid)>k時,說明我們做的太多了,那麼這時候我們就讓他小一點,也就是把mid調大,很顯然l=mid+1;
如果check(mid)
如果check(mid)=k,直接滿足題意,那麼我們就把ans=mid,作為備選答案,這時候處理左區間就好啦,即r=mid-1(因為你要的是n的最小值)
反之,對於求最大值而言,我們只需要把第3步中的處理左區間改為右就好啦,即l=mid+1;
然後這題就做完啦
說一下幾個細節
l初始為1,r初始為無窮大,答案也是無窮大
當答案不為無窮大也就是有答案時 那麼輸出答案;反之如果沒有,就直接輸出-1(這一步直接在求最小值中體現,因為如果最小值都沒有答案,最大值就更沒有了,思考下為什麼)
不開longlong見祖宗
以下就是code啦
#includeusingnamespace
std;
const
int maxn=100000+15
;#define int long long
inta[maxn],l,k,r,n,ans;
int check(int
x)
return
len;
}signed main()
l=1,r=1e15;
ans=1e15+1
;
while(l<=r)
if(ans!=1e15+1) printf("
%lld
",ans);
else
l=1,r=1e15;
ans=1e15+1
;
while(l<=r)
printf(
"%lld\n
",ans);
return0;
}
SHOI2015 自動刷題機
我也想要乙個!顯然能夠看出來單調性 當n越大,能ac的題越少,反之越少。所以。很明顯的二分答案對吧。唯一一點不太一樣的是,它要求可能的最大值,和可能的最小值。那我們就寫兩個check,先求出來最大值,如果算出來的ac題數大於等於k,我們就選擇右區間。然後再0和最大值的區間中再次二分 減小帶的log的...
洛谷P4343 SHOI2015 自動刷題機
題目 易得該題目中的 n 和 k 具有單調性,滿足二分的性質,因此該題目而已用二分來列舉 n 然後對於每個 n 模擬出它所對應的 k 然後注意注意 細節,並且當當前 k 等於題目要求的 k 時,要分別向左和右二分,才能找出所有情況。include define n 3000011 define in...
BZOJ 4590 Shoi2015 自動刷題機
bzoj 4590 shoi2015 自動刷題機 二分答案 曾經發明了訊號增幅儀的發明家shtsc又公開了他的新發明 自動刷題機 一種可以自動ac題目的神秘裝置。自動 刷題機刷題的方式非常簡單 首先會瞬間得出題目的正確做法,然後開始寫程式,每秒,自動刷題機的 生成模 塊會有兩種可能的結果 a.寫了x...