zoukankan      html  css  js  c++  java
  • 拼不出的数字

    题目

    大致题意:给你一个n个元素的集合,问你最小的不能由该集合子集拼出的数字是多少

    思路- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

                                                 排序+前缀和

    核心语句:if(a[i]>sum+1)cout<<sum+1,return 0;

    原理:

    sum表示当前前缀和

    如果当前加入的数大于前缀和+1,那么输出前缀和+1,否则继续。

    因为需要表示连续的整数,那么相邻的数最多只能差1.

    如果排序后k前面的数字之和<k-1,那么k-1这个数就无法表示。

    再详细的说就是 

    现在能表示出[0,0]这个区间,那么对于排序后接下来的数k,如果k>1,那么1

    这个数就永远也拼不出来。那么对于之前能拼出的区间为[0,x],加上k之后能拼出

    的数至少为[k,x+k],必须要求[0,x]这个区间的右端点和[k,k+x]的左端点连续才能把所有

    数都拼出来,也就是k<=x+1。

    代码:- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    #include <bits/stdc++.h>// 排序 + 前缀和 
    #define ll long long
    using namespace std;
    ll n,sum=0,a[100010];//sum为上一个前缀和 
    int main(){
        cin>>n;
        for(ll i=1;i<=n;i++)cin>>a[i];
        sort(a+1,a+n+1);
        for(ll i=1;i<=n;i++){
            if(a[i]>sum+1){//说明 sum+1不能被拼出 
                cout<<sum+1<<endl;
                return 0;
            }
            sum+=a[i];//当前前缀和 
        }
        cout<<sum+1;//如果运行到这里,说明 1~sum的数都能被拼出 
    }

    注意:int会爆,要用 long long

  • 相关阅读:
    单精度和双精度
    @Transactional注解用法
    JPA No EntityManager with actual transaction available for current thread
    上传文件Request Entity Too Large解决办法
    PG数据库查看当前会话和结束会话
    Chrome浏览器记不住密码也不提示保存密码win10
    ARM平台VMP保护开发入门
    关于我
    HDU7072:Boring data structure problem——题解
    HDU7067:Just another board game——题解
  • 原文地址:https://www.cnblogs.com/lxy050129/p/10722988.html
Copyright © 2011-2022 走看看