UVa 12563(一種錯誤做法和一種正確做法)

2021-08-10 12:02:43 字數 1677 閱讀 4151

題意:

求在給定時間內,最多能唱多少歌曲,在最多歌曲的情況下,使唱的時間最長。 該題類似於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...