SHOI2015 自動刷題機 題解

2022-07-08 15:15:23 字數 1305 閱讀 4546

題目鏈結

自動刷題機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啦

#includeusing

namespace

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...