bzoj1110 貪心 砝碼Odw

2021-08-27 21:19:25 字數 1732 閱讀 4456

description

在byteotian公司搬家的時候,他們發現他們的大量的精密砝碼的搬運是一件惱人的工作。公司有一些固定容

量的容器可以裝這些砝碼。他們想裝盡量多的砝碼以便搬運,並且丟棄剩下的砝碼。每個容器可以裝的砝碼數量有

限制,但是他們能夠裝的總重量不能超過每個容器的限制。乙個容器也可以不裝任何東西。任何兩個砝碼都有乙個

特徵,他們的中總有乙個的重量是另外乙個的整數倍,當然他們也可能相等。

input

第一行包含兩個數n和m。表示容器的數量以及砝碼的數量。(1<=n, m<=100000) 第二行包含n個整數wi,表示

每個容器能夠裝的最大質量。(1<=wi<=1000000000) 第三行包含m個整數mj,表示每個砝碼的質量。(1<=mj<=10000

00000)

output

僅包含乙個數,為能夠裝進容器的最多的砝碼數量。

sample input

2 4

13 9

4 12 2 4

sample output

題解

orz鏼爺

砝碼兩兩互為倍數關係,從小到大排個序,可以發現不同的砝碼種類數是log(10^9)級別的,只有30左右。

根據貪心的思想,砝碼從小到大依次裝入一定是最優的

把每個容器的容量寫成砝碼大小的進製表示,比如當有3,9,18,54這些種類的砝碼時,133的容量可以寫成2*54+1*18+0*9+2*3+1,末尾的+1永遠用不上,可以捨棄,那麼各位從低到高分別是(2,0,1,2)。

把所有容器都寫成這種表示,並把同一位上全部累加。比如說我們還有乙個容器(0,1,2,0),那麼兩個容器累加的結果就是(2,1,3,2)。

當我們正在放大小為3的砝碼時,就使用最低位上的容量。比如我們只有1個大小為3的砝碼,那麼塞入以後剩餘容量為(1,1,3,2)。接下來要放大小為9的砝碼,最低位上的那個1就永遠用不上了。假如我們有2個9,而第二位上只有1的容量,那麼就往高位借乙個18拆成兩個9,變成(2,3,2,2),然後塞入後剩餘(2,1,2,2)。以此類推。

當剩餘容量不夠再放入時即停止,當前已放入的砝碼個數即為最優答案。

#include

#include

#include

#include

#include

using

namespace

std;

int n,m;

int l1[110000],len,gg[110000],a[110000],b[110000];

int main()

sort(b+1,b+1+m);

sort(l1+1,l1+1+len);

len=unique(l1+1,l1+1+len)-(l1+1);

for(int i=1;i<=n;i++)

for(int j=len;j>=1;j--)gg[j]+=a[i]/l1[j],a[i]%=l1[j];

int ans=0;

for(int i=1;i<=m;i++)

printf("%d\n",ans);

return

0;}

51NOD 1449 砝碼稱重 貪心 進製思想

題目連線 1449 砝碼稱重 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 現在有好多種砝碼,他們的重量是 w0 w1,w2,每種各乙個。問用這些砝碼能不能表示乙個重量為m的東西。樣例解釋 可以將重物和3放到乙個托盤中,9和1放到另外乙個托...

51nod 1449 砝碼稱重(進製思想 貪心)

現在有好多種砝碼,他們的重量是 w0,w1,w2,每種各乙個。問用這些砝碼能不能表示乙個重量為m的東西。樣例解釋 可以將重物和3放到乙個托盤中,9和1放到另外乙個托盤中。單組測試資料。第一行有兩個整數w,m 2 w 10 9,1 m 10 9 如果能,輸出yes,否則輸出no。3 7yes由於每種砝...

貪心 bzoj 3008 象棋

本題的難點是 移動過程中不能出現多顆棋子同時在某一格的情況 事實上,可以忽略此條件,因為棋子是相同的,我們可以用合法的等效方案替代一棋子越過另一棋子的情況 a b c三格,a能在一步走到b,b也能在一步走到c。在a的棋子需要走到存在棋子的b,接著走到c。此情形我們可以看成在b的棋子先走到c,接著在a...