51Nod 1596 搬貨物 思維

2021-08-18 21:08:47 字數 1826 閱讀 7550

現在有n個貨物,第i個貨物的重量是 2^wi 。每次搬的時候要求貨物重量的總和是乙個2的冪。問最少要搬幾次能把所有的貨物搬完。

1,1,2作為一組。

3,3作為一組。

單組測試資料。

第一行有乙個整數n (1≤n≤10^6),表示有幾個貨物。

第二行有n個整數 w1,w2,…,wn,(0≤wi≤10^6)。

輸出最少的運貨次數。

5 1 1 2 3 3

思路:

2^2+2^2 = 2^3 = 2*(2^2)

通過這個例子我們可以發現,2的2次冪出現了兩次可以合成乙個2的3次冪,只有這種情況下才可以成為乙個2的冪

所以如果某 i 次冪的個數》1,我們應該讓它i+1次冪的個數加1,如果i次冪的個數是偶數(n)個,那麼就可以合成的i+1次冪的個數就是n/2。如果某i次冪的個數==1,說明無法合成,就得這消耗一次去搬這個貨物。

ac**:

注意:這個題可能會卡輸入輸出,然後如果不用輸入輸出外掛程式,這個**耗時300+ms,用了輸入輸出外掛程式效率提高了10倍,耗時31ms。(第一次用輸入輸出外掛程式,就記錄一下)

#include

using

namespace

std;

const

int maxn = 2e6+5;

int a[maxn];

int n;

int ans = 0;

//加速輸入外掛程式(fread加強版)

const

int maxbuf = 10000;

char buf[maxbuf], *ps = buf, *pe = buf+1;

inline

void rnext()

template

inline

bool in(t &ans)

while(!isdigit(*ps) && ps != pe);

if(ps == pe) return

false;//eof

do while(isdigit(*ps) && ps != pe);

ans *= f;

return

true;

}//加速輸出外掛程式(fread加強版)

const

int maxout=10000;

char bufout[maxout], outtmp[50],*pout = bufout, *pend = bufout+maxout;

inline

void write()

inline

void out_char(char c)

inline

void out_str(char *s)

}template

inline

void out_int(t x)

if(x < 0) x = -x,out_char('-');

int len = 0;

while(x)

outtmp[len] = 0;

for(int i = 0, j = len-1; i < j; i++,j--) swap(outtmp[i],outtmp[j]);

out_str(outtmp);}//

int main()

for(int i=0;i<=maxn-5;i++)

if(a[i] == 1) ans++;

}out_int(ans);

write();

return

0;}

51Nod 1596 搬貨物 (數學

input 單組測試資料。第一行有乙個整數n 1 n 10 6 表示有幾個貨物。第二行有n個整數 w1,w2,wn,0 wi 10 6 output 輸出最少的運貨次數。input示例 樣例輸入1 5 1 1 2 3 3 output示例 樣例輸出1 2很有意思的一道題 利用二進位制2333 inc...

51nod 1596 搬貨物 思路題

現在有n個貨物,第i個貨物的重量是 2wi 每次搬的時候要求貨物重量的總和是乙個2的冪。問最少要搬幾次能把所有的貨物搬完。樣例解釋 1,1,2作為一組。3,3作為一組。input 單組測試資料。第一行有乙個整數n 1 n 10 6 表示有幾個貨物。第二行有n個整數 w1,w2,wn,0 wi 10 ...

51 nod 1596 搬貨物 優先佇列水題)

1596搬貨物 基準時間限制 1秒 空間限制 131072kb 分值 10難度 2級演算法題 收藏關注 取消關注 現在有n個貨物,第i個貨物的重量是 2 w i 每次搬的時候要求貨物重量的總和是乙個2的冪。問最少要搬幾次能把所有的貨物搬完。樣例解釋 1,1,2作為一組。3,3作為一組。input 單...