[51Nod](1596)搬货物 ---- 思维

5人阅读 评论(0) 收藏 举报
分类:

现在有n个货物,第i个货物的重量是 2^wi 。每次搬的时候要求货物重量的总和是一个2的幂。问最少要搬几次能把所有的货物搬完。

样例解释:

1,1,2作为一组。

3,3作为一组。

Input

单组测试数据。
第一行有一个整数n (1≤n≤10^6),表示有几个货物。
第二行有n个整数 w1,w2,…,wn,(0≤wi≤10^6)。

Output

输出最少的运货次数。

Input示例

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<bits/stdc++.h>
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()
{
    if(++ps == pe)
        pe = (ps = buf)+fread(buf,sizeof(char),sizeof(buf)/sizeof(char),stdin);
}

template <class T>
inline bool in(T &ans)
{
    ans = 0;
    T f = 1;
    if(ps == pe) return false;//EOF
    do{
        rnext();
        if('-' == *ps) f = -1;
    }while(!isdigit(*ps) && ps != pe);
    if(ps == pe) return false;//EOF
    do
    {
        ans = (ans<<1)+(ans<<3)+*ps-48;
        rnext();
    }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()
{
    fwrite(bufout,sizeof(char),pout-bufout,stdout);
    pout = bufout;
}
inline void out_char(char c){ *(pout++) = c;if(pout == pend) write();}
inline void out_str(char *s)
{
    while(*s)
    {
        *(pout++) = *(s++);
        if(pout == pend) write();
    }
}
template <class T>
inline void out_int(T x) {
    if(!x)
    {
        out_char('0');
        return;
    }
    if(x < 0) x = -x,out_char('-');
    int len = 0;
    while(x)
    {
        outtmp[len++] = x%10+48;
        x /= 10;
    }
    outtmp[len] = 0;
    for(int i = 0, j = len-1; i < j; i++,j--) swap(outtmp[i],outtmp[j]);
    out_str(outtmp);
}
//
int main()
{
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    #endif // LOCAL
//    ios_base::sync_with_stdio(false);
//    cin.tie(NULL),cout.tie(NULL);
    memset(a,0,sizeof(a));
    int e;
    in(n);
    for(int i=1;i<=n;i++)
    {
        in(e);
        a[e]++;
    }
    for(int i=0;i<=maxn-5;i++)
    {
        if(a[i]>1)
        {
            a[i+1] += a[i]/2;
            a[i]%=2;
        }
        if(a[i] == 1) ans++;
    }
    out_int(ans);
    write();
    return 0;
}
查看评论

编程思维启蒙(Raptor)

Raptor是一种基于流程图的可视化编程开发环境。程序设计初学 者普遍存在“编程没思路”的问题,这与同时学计算机语言与编程 方法造成的认知负荷过大有关。Raptor用一系列相互连接的图形 符号以及符号之间的连接(流程图)可视化表达编程思路,不涉 及语言细节,有效地降低学习者的认知负荷,达到“会思考”的目 标,这为进一步学习用计算机语言(如C、C++、Java等)编程奠 定思维基础。
  • 2016年09月13日 08:45

51nod 1596搬货物 解题报告

题目链接:51nod 1596搬货物这一题把我恶心到了,连续T了6次,最后500+ms过了先说解题思路吧,每个物品质量都是2的幂,质量和为2的幂的物体可以一起搬。假设有一个物体质量为2^x,它和另一件...
  • Q1410136042
  • Q1410136042
  • 2017-08-03 10:49:32
  • 211

51Nod-1596-搬货物

ACM模版描述题解猛一看好心塞,不会做,但是抱着试试的心态写写画画,然后发现还是我对二进制知之甚少,原来只要先将序列中每一次方的数目存入数组,然后对应进位即可。好渣啊我~~~ 最近几天荒了些许,好几天...
  • f_zyj
  • f_zyj
  • 2016-12-26 16:53:20
  • 854

51Nod 1596 搬货物

1596 搬货物 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 ...
  • yao1373446012
  • yao1373446012
  • 2017-02-20 18:45:24
  • 291

51NOD 1596 搬货物

1596 搬货物 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注现在有n个货物,第i个货物的重量是 2wi 。每次搬的...
  • LuRiCheng
  • LuRiCheng
  • 2016-12-25 18:54:58
  • 385

51nod 1596 搬货物

1596 搬货物 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 现在有n个货物,第i个...
  • qq_32734731
  • qq_32734731
  • 2017-01-13 22:42:51
  • 656

51nod-1596 搬货物

1596 搬货物 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 ...
  • Cai_Nia
  • Cai_Nia
  • 2017-02-27 19:06:06
  • 362

51Nod1596 搬货物(codeforces)

1596 搬货物 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 ...
  • gtuif
  • gtuif
  • 2017-08-07 17:47:15
  • 216

51nod 1596 搬货物 思路题

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1596题意:现在有n个货物,第i个货物的重量是 2wi 。每次搬的时...
  • discreeter
  • discreeter
  • 2017-07-30 20:34:11
  • 188

51 nod 1596搬货物 (二进制进位或优先队列)

思路题,可以直接模拟,也可以发现就是二进制的进位。
  • zuzhiang
  • zuzhiang
  • 2017-09-19 18:01:20
  • 201
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 1803
    排名: 2万+
    最新评论