螞蟻的難題(三)
時間限制:
2000
ms |
記憶體限制:
65535kb
難度:4
描述
螞蟻終於把盡可能多的食材都搬回家了,現在開始了大廚計畫。
已知一共有n件食材,每件食材有乙個美味度ai和新鮮度bi, 如果螞蟻在第t時刻將第i樣食材烹飪成功,則得到ai-t*bi的美味指數,當然,用第i件食材做飯要花去ci的時間。
眾所周知,螞蟻的廚藝不怎麼樣,所以他需要你設計做飯方案使得在時間t內完成的美味指數最大。
輸入
有多組測試資料。
第一行是兩個正整數,表示螞蟻的做飯時間
t和食材個數n。
(n<=50, 1<=t<=100000)
。接下來
n行,每行有三個數,
ai,bi,ci
。分別代表美味度、新鮮度和用該食材做飯花費的時間。(0
輸出
輸出乙個數字,表示最大美味指數
樣例輸入
6 1
200 5 1
樣例輸出
195
思路:如果沒有b[i]這個屬性的話就是明顯的01揹包問題。
現在考慮相鄰的兩個物品x,y.假設現在已經耗費p的時間,那麼分別列出先做x,y的代價:
a[x]-(p+c[x])*b[x]+a[y]-(p+c[x]+c[y])*b[y] ①
a[y]-(p+c[y])*b[y]+a[x]-(p+c[y]+c[x])*b[x] ②
對這兩個式子化簡,得到 ①>② 的條件是 c[x]*b[y]
發現只要滿足這個條件的物品對(x,y),x在y前的代價永遠更優。
因此可以根據這個條件進行排序,之後就是簡單的01揹包了。
ac碼:
#include#include#includelong long d[100005];
struct node
num[60];
long long max(long long x,long long y)
int cmp(const void *x,const void *y)
int main()
} for(i=1;i<=t;i++)
d[0]=max(d[0],d[i]);
printf("%lld\n",d[0]);
} return 0;
}
螞蟻的難題(三)
描述 螞蟻終於把盡可能多的食材都搬回家了,現在開始了大廚計畫。已知一共有n件食材,每件食材有乙個美味度ai和新鮮度bi,如果螞蟻在第t時刻將第i樣食材烹飪成功,則得到ai t bi的美味指數,當然,用第i件食材做飯要花去ci的時間。眾所周知,螞蟻的廚藝不怎麼樣,所以他需要你設計做飯方案使得在時間 t...
nyoj 747 螞蟻的難題 三
時間限制 2000 ms 記憶體限制 65535 kb 難度 4 描述 螞蟻終於把盡可能多的食材都搬回家了,現在開始了大廚計畫。已知一共有n件食材,每件食材有乙個美味度ai和新鮮度bi,如果螞蟻在第t時刻將第i樣食材烹飪成功,則得到ai t bi的美味指數,當然,用第i件食材做飯要花去ci的時間。眾...
螞蟻的難題(二)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 下雨了,下雨了,螞蟻搬家了。已知有n種食材需要搬走,這些食材從1到n依次排成了乙個圈。小螞蟻對每種食材都有乙個喜愛程度值vi,當然,如果vi小於0的時候,表示螞蟻討厭這種食材。因為馬上就要下雨了,所以螞蟻只能搬一次,但是能夠搬走...