題目背景
此題為NOip2005普及組第三題的瘋狂版。
此題為紀念LiYuxiang而生。 題目描述
LiYuxiang是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了一個難題。醫師把他帶到一個到處都是草藥的山洞里對他說:“孩子,這個山洞里有一些不同種類的草藥,采每一種都需要一些時間,每一種也有它自身的價值。我會給你一段時間,在這段時間里,你可以采到一些草藥。如果你是一個聰明的孩子,你應該可以讓采到的草藥的總價值最大。”
如果你是LiYuxiang,你能完成這個任務嗎?
此題和原題的不同點:
1.每種采藥可以無限制地瘋狂采摘。
2.藥的種類眼花繚亂,采藥時間好長好長啊!師傅等得菊花都謝了! 輸入輸出格式 輸入格式:
輸入第一行有兩個整數T(1 <= T <= 100000)和M(1 <= M <= 10000),用一個空格隔開,T代表總共能夠用來采藥的時間,M代表山洞里的草藥的數目。接下來的M行每行包括兩個在1到10000之間(包括1和10000)的整數,分別表示采摘某種草藥的時間和這種草藥的價值。
輸出格式:
輸出一行,這一行只包含一個整數,表示在規定的時間內,可以采到的草藥的最大總價值。
輸入輸出樣例 輸入樣例#1:
70 3 71 100 69 1 1 2
輸出樣例#1:
140
說明
對于30%的數據,M <= 1000;
對于全部的數據,M <= 10000,且M*T<10000000(別數了,7個0)。
加油LiYuxiang,第一個AC留給你!
此題卡常,不要用Max,改用符號。 解釋什么是卡常數: 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); 明顯前者快,但在時間復雜度中都是一樣O(n^2) 循環里面的東西快慢就是叫做常數 這是一門很深的學科 比如 a是布爾類型 那么 if a then … 和 if a=true then … 速度不一樣的,就判定而言,前者比后者快2倍。 (前者只判斷a等不等于true, 后者先判斷a等不等于true,然后再判定“a=true”這個表達式等不等于true) 還有,因為計算機的原理,加減(+-)比比較(<=>)快。 所以盡量減少比較。 大致理解就好,敲了我這么久字啊。。
#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]; }新聞熱點
疑難解答