【問題描述】
一天晚上,我們資訊學競賽班的sfj 同學正往校門外走,忽然眼前一片漆黑,於是直
接把眼鏡都摔掉了,再也找不到。後來sfj 同學從學校管理處了解到昨晚路燈突然熄滅是
因為電路不堪重負,導致空氣開關跳閘。
sfj同學仔細了解每盞路燈的耗電量a[i]與照明度z[i],已知共有n 盞電燈,並且
每盞電燈都可能有不同的耗電量與照明度,現在的問題是要把這n盞電燈分為m 組,新分
出的每組燈的耗電量(即是該組所有開啟電燈的耗電量之和)不能超過該組的電燈數目的t
倍,在滿足這樣的前提下使得照明度盡可能的大,最後算出m 組的最大照明度的和。由於
每組耗電量的限制,該組中的某些電燈可能不被使用,但是仍然應該算作該組燈的數目。
特別注意的是電燈按順序給出,只能把相鄰的幾盞燈分在一組。
由於計算較為複雜,sfj 同學經過反覆的計算仍然不能確定結果,現在就請你為他編寫
乙個程式來解決這個問題。
【輸入檔案】
light.in 檔案中共有n+1 行,第一行三個整數分別為n,m,t 接下來的n 行每行兩
個整數,分別為a[i]與z[i],所有資料之間以乙個空格分開。
【輸出檔案】
light.out 檔案僅包含乙個數,即輸出m組的最大照明度的和。
【輸入樣例1】
2 1 2
2 13 2
【輸出樣例1】
2【輸入樣例2】
5 2 2
1 12 2
3 34 4
5 5【輸出樣例2】
10【資料規模】
對於70%的資料,保證有2<=n<=80,1<=m<=35,1<=t,a[i],z[i]<=35;
對於全部的資料,保證有2<=n<=160,1<=m<=50,1<=t,a[i],z[i]<=50。
揹包dp:
#include//dp
#include#includeusing namespace std;
const int maxn=200;
int n,m,t;
int a[maxn],z[maxn];
int f[maxn*50];//耗電量為x時的照明度
int f2[maxn][maxn];//第i個到第j個的照明度
int ans[maxn][maxn];//前i個分為j個部分的和的最大值
int main()
for(int i=1;i<=n;i++)
for(int k=0;k<=(j-i+1)*t;k++)
}} for(int i=1;i<=n;i++)
{ for(int j=1;j<=min(i,m);j++)
{ for(int k=j-1;k
MZOJ 2018 03 31 考試隨想
第一道題,先是題看錯了,貪心的時候沒有貪心對,改了1mol,最後才改對,預計正常用時20min。1 include2 include3 include4 include5 include6 using namespace std 78 const int maxn 10000 10 9 const ...
MZOJ 1063 士兵守衛
bob特別喜歡戰略遊戲,但有時他不能盡快找到最優解,所以他就很傷心。現在他又有乙個問題,他必須保衛乙個中世紀的城市,這個城市的道路形成了一棵樹。他需要在樹的節點上放最少的士兵來觀察所有的邊。你能幫助他麼?例如下圖就只需要乙個士兵放在1號節點。輸入檔案中有多組資料,每組資料的第一行n表示點的個數。接下...
時間2007驛站
時間一轉就到了農曆的2007年了,豬年.離開學校也有就一段時間了.2006年畢業,找了個公司上班.先做了一段時間的dba,在那段dba時間中還真學了不少關於sql的東西.給了我乙個成長的機會.在這裡還是很謝謝,重慶軟體科技的同事們.給了我們多的幫助和支援.然後公司要寫個關天vpn的有專案.我接過來了...