| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1565 人关注过本帖
标题:这是啥意思
只看楼主 加入收藏
你爸边哭边
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2017-10-30
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:2 
这是啥意思
链接:https://ac.
来源:牛客网

题目描述
牛牛喜欢2的幂次,于是他在自己的书包里塞了很多写着2的幂次的卡片
可能多张卡片会写着同一个数字
牛牛喜欢那些能用一张或者多张卡片的和所表示的数字
比如书包里有四张卡片2,4,4,64
那么牛牛就会喜欢10,因为10=2+4+4
也喜欢0
但是不会喜欢12,因为12=4+4+2+2,可怜的牛牛只有一张2
现在牛牛想知道他一共会喜欢多少个数。
输入描述:

第一行输入一个整数n (1 ≤ n  ≤ 50),表示卡片的数量
第二行输入n个数,表示每张卡片的数字
每个数字在[1, 2^50]之间

输出描述:

输出一个整数

示例1
输入
复制

2
1 2

输出
复制

4

示例2
输入
复制

4
1 1 1 1

输出
复制

5

示例3
输入
复制

7
1 2 2 2 4 4 16

输出
复制

32

示例4
输入
复制

5
1 32 1 16 32

输出
复制

18

备注:

子任务1:n <= 10
子任务2: n <= 20
子任务3: n <= 50



这道题可以先从小到大排序。可以发现,如果第i个a值不会被前面的值累加得到,说明这个数是和前面的数没有关系,可以把前面的计入答案,否则,需要把cnt+  这个数除以这个独立集中最小值。


这是别人的思路,看不懂是啥意思


#include<bits/stdc++.h>
using namespace std;
long long  n,a[60];
int main()
{
    cin>>n;
    for(int i=1; i<=n; ++i)
        cin>>a[i];
    sort(a+1,a+1+n);
    a[n+1]=2333333333333333333ll;
    long long ans=1,base=0,num=0,Max=0;
    for(int i=1; i<=n+1; ++i)
        if(Max>=a[i])
        {
            num+=a[i]/base;
            Max+=a[i];
        }
        else
        {
            ans*=(num+1);
            base=a[i];
            Max=a[i];
            num=1;
        }
    cout<<ans<<endl;
    return 0;
}
别人的代码
搜索更多相关主题的帖子: 数字 输出 输入 num 复制 
2020-02-21 14:14
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
收藏
得分:20 
首先要理解题意,给出若干卡片,随机组合相加的数都是满足条件的
既然题目问的是牛牛可以喜欢多少个数,那么我们随机组合的数中,相同的就只会算一次,也就是说:
样例1中的 1 2,我们就可以组合成 1、2、1+2、2+1,但是因为1+2=2+1,所以我们要舍去一个,所以能生成3个,题目又说“也喜欢0”所以卡片生成的所有数的总数最终都要加一

现在我们来分析代码:
程序代码:
#include<bits/stdc++.h>
using namespace std;
long long  n,a[60];
int main()
{
    cin>>n;
    for(int i=1; i<=n; ++i)
        cin>>a[i]; //读入n张卡片
    sort(a+1,a+1+n); //将这些卡片从小到大排序
    a[n+1]=2333333333333333333ll; /*为什么要把第n+1张卡片赋值为这么大的值呢?我们只读入了n张卡片,而后面的循环却循环到n+1,也就是说,当for循环中的i为n+1时,我们的程序应该做的是循环里面的else语句块,这个以后你可以尝试着学习一下*/
    long long ans=1,base=0,num=0,Max=0; /*因为0也是符合条件的数,所以ans(最终答案)一开始就为1。关键是这个base,num和Max,我们可以在草稿纸上模拟一遍,大致可以得出:base用于记录一个从未出现过的数,num用于记录这个从未出现过的数所出现的次数,Max用于记录这个从未出现过的数加上它后边与其相等的数所能生成的最大的数*/
    for(int i=1; i<=n+1; ++i)
        if(Max>=a[i]) //这个地方我们可以大致理解为 判断a[i]是否已经出现过,出现过的话我们就执行此语句块
        {
            num+=a[i]/base; //当a[i]已经出现过时,我们将其出现次数加一【我测了几个样例,发现这个地方可以直接写成num++;,但不确定是否所有样例都如此】
            Max+=a[i]; //更新最大值
        }
        else //如果a[i]未出现过,我们就刷新一次数据
        {
            ans*=(num+1); //此时我们将答案更新为上一个数所能组成的数
            base=a[i]; //更新base的值
            Max=a[i]; //更新Max值
            num=1; //此时的a[i]已经出现过一次了,所以num赋值为1
        }
    cout<<ans<<endl;
    return 0;
}
2020-02-22 17:39
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
收藏
得分:0 
如果有错误的地方请指出,我下次会注意的,谢谢!
2020-02-22 17:40
快速回复:这是啥意思
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.091154 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved