現在有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 單...