codeforces 305 C. Ivan and Powers of Two

题目链接

      给出一个非减序的数组a[n], 然后得到s=2^a1+.……+2^an, 要使s为2^v -1,需要在数组中添加几个数。

      我的思路是这样的,由2^a+2^a = 2^(a+1)可知,如果有两个连续的数a,我们可以把他们合并为a+1放入集合中,使集合中没有重复的数,我可以用stl里的set。如果想要满足题目中的要求,集合中必须有最大那个数个元素,缺多少就可以计算出来了。

代码:

//codeforces 305 C. Ivan and Powers of Two
//2013-06-05-17.19
#include <stdio.h>
#include <set>
#include <algorithm>
#include <iostream>
using namespace std;
set<int> s;
int main()
{
    int n, a;
    while (scanf("%d", &n) != EOF)
    {
        s.clear();
        int maxn = 0;
        for (int i = 1; i <= n; i++)
        {
            scanf("%d", &a);
            while (s.count(a))
            {
                s.erase(a);
                a++;
            }
            s.insert(a);
            maxn = max(a, maxn);
        }
        printf("%d\n", maxn-s.size()+1);
    }
    return 0;
}



转载于:https://www.cnblogs.com/xindoo/archive/2013/06/05/3595131.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值