北大OJ Yogurt factory(貪心)

2021-09-10 17:45:58 字數 1736 閱讀 8996

原題連線:

本題題意是:有n周,每週製作+運輸酸奶的**c,需求y都有變化,另有倉庫,可儲存任意多的酸奶,每週每單位儲存**恆定為s,求n周最少的總成本。

本題的主要問題是:第i周的酸奶要不要之前就製作好存下來,還是直接做完賣了,就是存與不存的問題。

下面我們來探尋一下存與不存的條件。

n sc[i], y[i] c[k],y[k]

if( (c[k]-c[i])*y[k] >= (k-i)sy[k] ) 存

else 不存

即 c[k]-c[i]~~(k-i)*s 的大小關係,大於等於存,小於不存。

不過,問題來了:

1.假設從i周開始,i+1–m-1週都在i周製作並儲存,那如果在第m周同樣滿足可以在第i週存的條件,但會不會在i+1–m-1之間某一周k(ik)週會不會重新出現在i周滿足存的條件呢?

為了簡化問題,我們將問題 1 ,問題 2 的答案都假設為否定。

證明問題 1:

n sc[i] y[i] c[k] y[k] c[m] y[m]

已知:c[k]-c[i]>=(k-i)*s;

設 c[k]-c[i]=d;則d>=(k-i)*s;

比較c[m]-c[i]-(m-i)·s–c[m]-c[k]-(m-k)·s的大小(注意,不是比較c[m]-c[i]–c[m]-c[k]的大小)

亦即比較 c[m]-c[i]-(m-i)·s-(c[m]-c[k]-(m-k)·s)–0的大小

化簡可得 c[k]-c[i]-(k-i)*s=d-(k-i)*s~~0;

而d>=(k-i)*s,故d-(k-i)*s>=0;

因此c[m]-c[i]-(m-i)*s>=c[m]-c[k]-(m-k)*s;

從結論可知,即使在第k周可以存,也不比在第i週存來的有利,成本一定比第i周的高,於是命題得以證明,問題 1 答案為否定。

證明問題 2:

n sc[i] y[i] c[k] y[k] c[m] y[m]

已知:c[k]-c[i]<(k-i)*s;

設 c[k]-c[i]=d;則d<(k-i)*s;

由問題 1 的過程可得

c[m]-c[i]-(m-i)*s總結:

1.i+1–m-1,m周的酸奶都可以在第i周製作後存下來,就不必考慮m周的酸奶可不可以在i+1–m-1製作後存下來了——只需考慮開頭與結尾的關係,不需考慮中間

2.k周不可以在i週存,新的起點,即新的儲存周直接定為k,不必考慮 i 對 k 周後面的影響了——新起點即為舊終點,舊起點對後面的影響不需考慮

偽**如下:

輸入 n,s

輸入 c[n],y[n]

long long sum,flag=0;//flag為起點,初始為0

for(i=0;i<=n-1;i++)

輸出sum。

**如下:

#include#includeusing namespace std;

long long c[10005],y[10005];

int main()

else

}// printf("%d %lld\n",flag,sum);

} printf("%lld\n",sum);//}

return 0;

}

本題的證明出來的結論要好好消化,下回遇到相似的就不用再證了。此外本題有乙個特點——不可以排序。所以,至少按你目前的水平,千萬別排序。

北大ACM Packets(貪心)

題意 有一堆等高的包裝好的產品,有1 1,2 2,3 3,4 4,5 5,6 6六種包裝,且有6 6的包裹,用來裝這些包裝好的產品。分別給出每種包裝的數量,求所需的最少的包裹。分析 乙個包裹只能容下1個6 6餘0空位,1個5 5餘11,1個4 4餘20,最多能容下4個3 3,9個2 2,36個1 1...

數制轉換 北大

二刷 數制轉換 讀題可以發現題中可能有的幾個坑 資料可能存在包含前導零的情況 輸出時字母符號全部用大寫表示。其他 對於這種既有字元又有數字的轉換,常見的解決辦法就是初始化一張查詢表,之後進行對映查表,這樣會快很多。輸入和輸出都是字元陣列 include bits stdc h using names...

2016北大叉院 北大信科保研經歷

北大叉院大資料中心夏令營叉院夏令營完了後,因為北大信科夏令營是七月中旬,所以我直接賴在 寢室,在北京浪到了七月中旬,北大信科計算機系夏令營開始了。北大信科計算機系夏令營 北大信科計算機系夏令營只能直博。碩士要等到九月份,這次夏令營因為一些事情,過得並不太愉快。信科夏令營一共入營了300個人,但是因為...