題意:
求在給定時間內,最多能唱多少歌曲,在最多歌曲的情況下,使唱的時間最長。 該題類似於01揹包問題,可用01揹包問題的解題思路來求,每個歌曲相當於物品,歌曲的長度相等於物品重量,每個歌曲的「價值」為1。由於金歌勁曲時間最長,所以最後要留至少1秒時間開始唱金歌勁曲,所以計算t-1時間內最多唱的歌曲和時間,最終答案為歌曲數加1,時間加上金歌勁曲的時間。這裡我使用滾動陣列計算這個值, 用len記錄t-1。
需要注意的是,由於要求是連續唱歌,且要求在最多歌曲數的情況下時間最長,如果按普通的揹包儲存,很難得到最長時間,因為f[len] 只儲存了最多的歌曲數,但並不知道這些歌曲到底唱了多少時間。假設最多歌曲數為num, 唱num首歌曲最少時間為tmin, 那麼陣列中從f[tmin]到f[len]都等於num,我們無法得知唱num首歌的最大時間。比如說len = 10, t[1] = 5, t[2] = 8, 那麼f[5] 到 f[10] 都等於1, 無法知道唱從5到10哪個是唱1首歌的最長時間。如何處理呢?這裡需要用到乙個技巧:對決策進行一定的限定!在計算某個時間最多唱的歌曲時,必須是該時間內恰好唱完這些歌,時間多了不行。即f[j]表示的是在j 的時間恰好用完的情況下最多能唱多少首歌。比如上面的例子只有f[5] 和f[8]等於1,其他的都等於0。這樣的話處理時先算出最多唱的歌曲數 num,然後從j = len開始遍歷陣列f, 第乙個等於num的就是在最多歌曲情況下的最長時間。
錯誤**:
#include
#include
#include
#include
#include
#include
using
namespace
std;
int s[50+5],t,n,t,kase,sum[55][9778];//唱了多少首歌
int f[55][9778];//唱了多少時間
int main()}}
printf("case %d: %d %d\n",++kase,sum[n][t-1]+1,f[n][t-1]+678);
}return
0;}
錯誤思路:一開始用f陣列來儲存唱歌的時間,用sum陣列來儲存唱歌的數目,但我這樣寫是既滿足時間最長,又滿足唱歌的數目最大。不符合題意,題意是在滿足唱歌數目最多的情況下,唱歌的時間最長。所以只要用一維陣列就行了。
正確**:
#include
#include
#include
#define maxn 10000
using
namespace
std;
int f[maxn];
int v[55];
int main()}}
int i;
for(i=t-1;f[i]!=ans;i--);
if(ans==0)cout
<<"case "
<<++kase<<": "
<<1
<<" "
<<678
cout
<<"case "
<<++kase<<": "
<1
<<" "
<678
0;}
一種EXC BAD ACCESS錯誤的原因分析
最近在學ios開發的時候發現乙個奇怪的錯誤,在介面上放乙個文字框,其他什麼都不改就執行,然後在文字框中隨便輸入字元,輸入幾個就會報exc bad access錯誤,查了一下資料發現這種錯誤是由於記憶體訪問或釋放錯誤引起,但就放乙個控制項什麼都沒做怎麼也報這種錯呢,難道xcode模板 就有問題,加入調...
盛大創新院霍炬 UML 一種體系和一種思想
盛大創新院程式設計師 霍炬 早年我也喜歡過uml 覺得是對複雜工程的解決之道。後來碰上越來越多的實際問題,發現 uml並不能很好地解決。一方面,要能精確地用 uml定義問題,需要長時間的訓練。就好像用一門不熟練的語言說話,時常會導致誤解,uml也一樣。多年前我曾經在團隊裡推行過 uml,結果發現有大...
dao注入失敗 null 的一種錯誤
初接觸springboot,沒有使用配置檔案來配置bean的掃瞄規則,出現了 autowired service可以自動注入,但是 autowired dao不能注入,導致dao報空指標。controller controller public class blacklistcontroller s...