題目背景
此題為NOip2005普及組第三題的瘋狂版。
此題為紀(jì)念LiYuxiang而生。 題目描述
LiYuxiang是個(gè)天資聰穎的孩子,他的夢(mèng)想是成為世界上最偉大的醫(yī)師。為此,他想拜附近最有威望的醫(yī)師為師。醫(yī)師為了判斷他的資質(zhì),給他出了一個(gè)難題。醫(yī)師把他帶到一個(gè)到處都是草藥的山洞里對(duì)他說:“孩子,這個(gè)山洞里有一些不同種類的草藥,采每一種都需要一些時(shí)間,每一種也有它自身的價(jià)值。我會(huì)給你一段時(shí)間,在這段時(shí)間里,你可以采到一些草藥。如果你是一個(gè)聰明的孩子,你應(yīng)該可以讓采到的草藥的總價(jià)值最大。”
如果你是LiYuxiang,你能完成這個(gè)任務(wù)嗎?
此題和原題的不同點(diǎn):
1.每種采藥可以無限制地瘋狂采摘。
2.藥的種類眼花繚亂,采藥時(shí)間好長(zhǎng)好長(zhǎng)啊!師傅等得菊花都謝了! 輸入輸出格式 輸入格式:
輸入第一行有兩個(gè)整數(shù)T(1 <= T <= 100000)和M(1 <= M <= 10000),用一個(gè)空格隔開,T代表總共能夠用來采藥的時(shí)間,M代表山洞里的草藥的數(shù)目。接下來的M行每行包括兩個(gè)在1到10000之間(包括1和10000)的整數(shù),分別表示采摘某種草藥的時(shí)間和這種草藥的價(jià)值。
輸出格式:
輸出一行,這一行只包含一個(gè)整數(shù),表示在規(guī)定的時(shí)間內(nèi),可以采到的草藥的最大總價(jià)值。
輸入輸出樣例 輸入樣例#1:
70 3 71 100 69 1 1 2
輸出樣例#1:
140
說明
對(duì)于30%的數(shù)據(jù),M <= 1000;
對(duì)于全部的數(shù)據(jù),M <= 10000,且M*T<10000000(別數(shù)了,7個(gè)0)。
加油LiYuxiang,第一個(gè)AC留給你!
此題卡常,不要用Max,改用符號(hào)。 解釋什么是卡常數(shù): for i:=1 to n do for j:=1 to n do begin a:=a*b*c*c*d*s*w*f*f*e*s; b:=b*w*v*d*x*c*b*g*j*k*s; end; 和 for i:=1 to n do for j:=1 to n do inc(x); 明顯前者快,但在時(shí)間復(fù)雜度中都是一樣O(n^2) 循環(huán)里面的東西快慢就是叫做常數(shù) 這是一門很深的學(xué)科 比如 a是布爾類型 那么 if a then … 和 if a=true then … 速度不一樣的,就判定而言,前者比后者快2倍。 (前者只判斷a等不等于true, 后者先判斷a等不等于true,然后再判定“a=true”這個(gè)表達(dá)式等不等于true) 還有,因?yàn)橛?jì)算機(jī)的原理,加減(+-)比比較(<=>)快。 所以盡量減少比較。 大致理解就好,敲了我這么久字啊。。
#include<iostream>#include<cstdio>using namespace std;int T,M,t[10005],v[10005],f[100005];int main(){ scanf("%d%d",&T,&M); for(int i=1;i<=M;i++) scanf("%d%d",&t[i],&v[i]); for(int i=1;i<=M;i++) for(int j=t[i];j<=T;j++) { if(f[j]<f[j-t[i]]+v[i]) f[j]=f[j-t[i]]+v[i]; }新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注