P4774 [NOI2018]屠龙勇士
題目描述
小 D 最近在網(wǎng)上發(fā)現(xiàn)了一款小游戲。游戲的規(guī)則如下:
-
游戲的目標(biāo)是按照編號(hào) 1→n1 \rightarrow n1→n 順序殺掉 nnn 條巨龍,每條巨龍擁有一個(gè)初始的生命值 aia_iai? 。同時(shí)每條巨龍擁有恢復(fù)能力,當(dāng)其使用恢復(fù)能力時(shí),它的生命值就會(huì)每次增加 pip_ipi? ,直至生命值非負(fù)。只有在攻擊結(jié)束后且當(dāng)生命值 恰好 為 000 時(shí)它才會(huì)死去。
-
游戲開(kāi)始時(shí)玩家擁有 mmm 把攻擊力已知的劍,每次面對(duì)巨龍時(shí),玩家只能選擇一 把劍,當(dāng)殺死巨龍后這把劍就會(huì)消失,但作為獎(jiǎng)勵(lì),玩家會(huì)獲得全新的一把劍。 小 D 覺(jué)得這款游戲十分無(wú)聊,但最快通關(guān)的玩家可以獲得 ION2018 的參賽資格, 于是小 D 決定寫(xiě)一個(gè)笨笨的機(jī)器人幫她通關(guān)這款游戲,她寫(xiě)的機(jī)器人遵循以下規(guī)則:
-
每次面對(duì)巨龍時(shí),機(jī)器人會(huì)選擇當(dāng)前擁有的,攻擊力不高于巨龍初始生命值中攻擊力最大的一把劍作為武器。如果沒(méi)有這樣的劍,則選擇 攻擊力最低 的一把劍作為武器。
-
機(jī)器人面對(duì)每條巨龍,它都會(huì)使用上一步中選擇的劍攻擊巨龍固定的 xxx 次,使巨龍的生命值減少 x×ATKx \times ATKx×ATK 。
-
之后,巨龍會(huì)不斷使用恢復(fù)能力,每次恢復(fù) pip_ipi? 生命值。若在使用恢復(fù)能力前或某一次恢復(fù)后其生命值為 000 ,則巨龍死亡,玩家通過(guò)本關(guān)。
那么顯然機(jī)器人的攻擊次數(shù)是決定能否最快通關(guān)這款游戲的關(guān)鍵。小 D 現(xiàn)在得知了每條巨龍的所有屬性,她想考考你,你知道應(yīng)該將機(jī)器人的攻擊次數(shù) xxx 設(shè)置為多少,才能用最少的攻擊次數(shù)通關(guān)游戲嗎?
當(dāng)然如果無(wú)論設(shè)置成多少都無(wú)法通關(guān)游戲,輸出 ?1-1?1 即可。
輸入格式
第一行一個(gè)整數(shù) TTT,代表數(shù)據(jù)組數(shù)。
接下來(lái) TTT 組數(shù)據(jù),每組數(shù)據(jù)包含 555 行。
-
每組數(shù)據(jù)的第一行包含兩個(gè)整數(shù),nnn 和 mmm ,代表巨龍的數(shù)量和初始劍的數(shù)量;
-
接下來(lái)一行包含 nnn 個(gè)正整數(shù),第 iii 個(gè)數(shù)表示第 iii 條巨龍的初始生命值 aia_iai? ;
-
接下來(lái)一行包含 nnn 個(gè)正整數(shù),第 iii 個(gè)數(shù)表示第 iii 條巨龍的恢復(fù)能力 pip_ipi? ;
-
接下來(lái)一行包含 nnn 個(gè)正整數(shù),第 iii 個(gè)數(shù)表示殺死第 iii 條巨龍后獎(jiǎng)勵(lì)的劍的攻擊力;
-
接下來(lái)一行包含 mmm 個(gè)正整數(shù),表示初始擁有的 mmm 把劍的攻擊力。
輸出格式
一共 TTT 行。
第 iii 行一個(gè)整數(shù),表示對(duì)于第 iii 組數(shù)據(jù),能夠使得機(jī)器人通關(guān)游戲的最小攻擊次數(shù) xxx ,如果答案不存在,輸出 ?1-1?1。
輸入輸出樣例
輸入 #1 2 3 3 3 5 7 4 6 10 7 3 9 1 9 1000 3 2 3 5 6 4 8 7 1 1 1 1 1 輸出 #1 59 -1說(shuō)明/提示
第一組數(shù)據(jù):
-
開(kāi)始時(shí)擁有的劍的攻擊力為 {1,9,10}\{1,9,10\}{1,9,10},第 111 條龍生命值為 333,故選擇攻擊力為 111 的劍,攻擊 595959 次,造成 595959 點(diǎn)傷害,此時(shí)龍的生命值為 ?56-56?56,恢復(fù) 14 次后生命值恰好為 000,死亡。
-
攻擊力為 111 的劍消失,拾取一把攻擊力為 777 的劍,此時(shí)擁有的劍的攻擊力為 {7,9,10}\{7,9,10\}{7,9,10},第 2 條龍生命值為 555,故選擇攻擊力為 777 的劍,攻擊 595959 次,造成 413413413 點(diǎn)傷害,此時(shí)龍的生命值為 ?408-408?408,恢復(fù) 686868 次后生命值恰好為 000,死亡。
-
此時(shí)擁有的劍的攻擊力為 {3,9,10}\{3,9,10\}{3,9,10},第 333 條龍生命值為 777,故選擇攻擊力為 333 的劍,攻擊 595959 次,造成 177177177 點(diǎn)傷害,此時(shí)龍的生命值為 ?170-170?170,恢復(fù) 171717 次后生命值恰好為 0,死亡。
-
沒(méi)有比 595959 次更少的通關(guān)方法,故答案為 595959。
第二組數(shù)據(jù): 不存在既能殺死第一條龍又能殺死第二條龍的方法,故無(wú)法通關(guān),輸出 ?1-1?1。
【子任務(wù)】
| 1 | ≤105\le 10^5≤105 | =1=1=1 | =1=1=1 | ≤105\le 10^5≤105 | =1=1=1 | 無(wú) |
| 2 | ≤105\le 10^5≤105 | =1=1=1 | =1=1=1 | ≤105\le 10^5≤105 | =1=1=1 | 無(wú) |
| 3 | ≤105\le 10^5≤105 | =1=1=1 | =1=1=1 | ≤105\le 10^5≤105 | ≤105\le 10^5≤105 | 無(wú) |
| 4 | ≤105\le 10^5≤105 | =1=1=1 | =1=1=1 | ≤105\le 10^5≤105 | ≤105\le 10^5≤105 | 無(wú) |
| 5 | ≤103\le 10^3≤103 | ≤103\le 10^3≤103 | ≤105\le 10^5≤105 | ≤105\le 10^5≤105 | ≤105\le 10^5≤105 | 特性 1、特性 2 |
| 6 | ≤103\le 10^3≤103 | ≤103\le 10^3≤103 | ≤105\le 10^5≤105 | ≤105\le 10^5≤105 | ≤105\le 10^5≤105 | 特性 1、特性 2 |
| 7 | ≤103\le 10^3≤103 | ≤103\le 10^3≤103 | ≤105\le 10^5≤105 | ≤105\le 10^5≤105 | ≤105\le 10^5≤105 | 特性 1、特性 2 |
| 8 | =1=1=1 | =1=1=1 | ≤108\le 10^8≤108 | ≤108\le 10^8≤108 | ≤106\le 10^6≤106 | 特性 1 |
| 9 | =1=1=1 | =1=1=1 | ≤108\le 10^8≤108 | ≤108\le 10^8≤108 | ≤106\le 10^6≤106 | 特性 1 |
| 10 | =1=1=1 | =1=1=1 | ≤108\le 10^8≤108 | ≤108\le 10^8≤108 | ≤106\le 10^6≤106 | 特性 1 |
| 11 | =1=1=1 | =1=1=1 | ≤108\le 10^8≤108 | ≤108\le 10^8≤108 | ≤106\le 10^6≤106 | 特性 1 |
| 12 | =1=1=1 | =1=1=1 | ≤108\le 10^8≤108 | ≤108\le 10^8≤108 | ≤106\le 10^6≤106 | 特性 1 |
| 13 | =1=1=1 | =1=1=1 | ≤108\le 10^8≤108 | ≤108\le 10^8≤108 | ≤106\le 10^6≤106 | 特性 1 |
| 14 | =105=10^5=105 | =105=10^5=105 | =1=1=1 | ≤108\le 10^8≤108 | ≤106\le 10^6≤106 | 無(wú)特殊限制 |
| 15 | =105=10^5=105 | =105=10^5=105 | =1=1=1 | ≤108\le 10^8≤108 | ≤106\le 10^6≤106 | 無(wú)特殊限制 |
| 16 | ≤105\le 10^5≤105 | ≤105\le 10^5≤105 | 所有 pip_ipi? 是質(zhì)數(shù) | ≤1012\le 10^{12}≤1012 | ≤106\le 10^6≤106 | 特性 1 |
| 17 | ≤105\le 10^5≤105 | ≤105\le 10^5≤105 | 所有 pip_ipi? 是質(zhì)數(shù) | ≤1012\le 10^{12}≤1012 | ≤106\le 10^6≤106 | 特性 1 |
| 18 | ≤105\le 10^5≤105 | ≤105\le 10^5≤105 | 無(wú)特殊限制 | ≤1012\le 10^{12}≤1012 | ≤106\le 10^6≤106 | 特性 1 |
| 19 | ≤105\le 10^5≤105 | ≤105\le 10^5≤105 | 無(wú)特殊限制 | ≤1012\le 10^{12}≤1012 | ≤106\le 10^6≤106 | 特性 1 |
| 20 | ≤105\le 10^5≤105 | ≤105\le 10^5≤105 | 無(wú)特殊限制 | ≤1012\le 10^{12}≤1012 | ≤106\le 10^6≤106 | 特性 1 |
特性 1 是指:對(duì)于任意的 iii,ai≤pia_i \le p_iai?≤pi?。
特性 2 是指:lcm?(pi)≤106\operatorname{lcm}(p_i) \le 10^6lcm(pi?)≤106,即所有 pip_ipi? 的 最小公倍數(shù) 不大于 10610^6106。
對(duì)于所有的測(cè)試點(diǎn),T≤5T \le 5T≤5,所有武器的攻擊力 ≤106\le 10^6≤106,所有 pip_ipi? 的最小公倍數(shù) ≤1012\le 10^{12}≤1012。
保證 T,n,m T, n, m T,n,m 均為正整數(shù)。
【提示】
你所用到的中間結(jié)果可能很大,注意保存中間結(jié)果的變量類(lèi)型。
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<set> #pragma GCC optimize(2) using namespace std; typedef long long LL; const int maxn = 1e5 + 10 ; LL a[maxn],p[maxn],atk[maxn],x,y,d; multiset<LL> sw;inline LL read() {LL w=1,s=0; char ch=getchar();while(ch<'0' || ch>'9'){if(ch=='-')w=-1; ch=getchar();}while(ch>='0' && ch<='9'){s=s*10+ch-'0'; ch=getchar();}return w*s; } void ext_gcd(LL a,LL b,LL &d,LL &x,LL &y) {if (b==0){d=a;x=1;y=0;return;}ext_gcd(b,a%b,d,y,x); y-=a/b*x; }inline LL ksc(LL x,LL y,LL p){LL z=(long double)x/p*y;LL res=(unsigned long long)x*y-(unsigned long long)z*p;return (res+p)%p; }int main() {LL T,n,m,k,mx,c;T=read();begin:while(T--){n=read();m=read();sw.clear();register multiset<LL>::iterator it;for(int i=1;i<=n;i++) a[i]=read();for(int i=1;i<=n;i++) p[i]=read();for(int i=1;i<=n;i++) atk[i]=read();for(int i=1;i<=m;i++)sw.insert(read());mx=c=0;m=1;for(int i=1;i<=n;i++){it=sw.upper_bound(a[i]);if(sw.begin()!=it) it--;k=*it;sw.erase(it);sw.insert(atk[i]);mx=max(mx,(a[i]-1)/k+1);//更新限制k%=p[i];a[i]%=p[i];if(!k && !p[i]) continue;ext_gcd(k,p[i],d,x,y);p[i]/=d;a[i]=ksc(a[i]/d,(x%p[i]+p[i])%p[i],p[i]);ext_gcd(m,p[i],d,x,y);if((a[i]-c)%d){puts("-1");goto begin;}m=m/d*p[i];c=(c+ksc( ksc(m/p[i],((a[i]-c)%m+m)%m,m) , (x%m+m)%m , m))%m;}if(c>=mx) printf("%lld\n",c);else printf("%lld\n",c+m*((mx-c-1)/m+1));}return 0; }?
?
轉(zhuǎn)載于:https://www.cnblogs.com/hfang/p/11256752.html
總結(jié)
以上是生活随笔為你收集整理的P4774 [NOI2018]屠龙勇士的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Learning the Vi Edit
- 下一篇: 上帝与集合的正确用法(bzoj3884)