幸运数字Ⅱ

幸运数字Ⅱ

https://ac.nowcoder.com/acm/contest/5086/E

牛客网

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld

题目描述

定义一个数字为幸运数字当且仅当它的所有数位都是4或者7。 比如说,47、744、4都是幸运数字而5、17、467都不是。
定义next(x)为大于等于x的第一个幸运数字。给定l,r,请求出next(l) + next(l + 1) + ... + next(r

  • 1) + next(r)。 输入描述:

两个整数l和r (1 <= l <= r <= 1000,000,000)。

输出描述:

一个数字表示答案。

示例1
输入

2 7

输出

33

示例2
输入

7 7

输出

7

题意:
打表出奇迹
你可以提前打好表,记录在数组里
或者现打表,有两个方法
一个是用vector,
或者自身递归查找,存在pre中
打完表后,直接从l开始对比数到r
直接if判断然后sum加有点慢
你可以看每两个pre之间的数最后都做一样相加,比如47~74之间(不含47)的数都算作74,那有多少个数?就是74-47+1,然后直接乘74,加起来就ok了
注意注意!!!不要忘了longlong,可坑死我了

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll pre[100000];
int cnt=0;
int min(ll a,ll b)
{
    return a>b?b:a;
}
void dfs(ll n)
{
    if(n>1e10+2)return ; 
    pre[cnt++]=n;
    dfs(n*10+4);
    dfs(n*10+7);
}
/*
void dfs(ll x)
{
    if(n-1e9>0)return ;
    q.push_back((x<<3)+(x<<1)+4);
    dfs((x<<3)+(x<<1)+4);
    dfs((x<<3)+(x<<1)+7);
    q.push_back((x<<3)+(x<<1)+7);
}

dfs(0);
sort(q.begin(),q.end());
q.push_back(4444444444); 
*/
int main()
{
    ll r,l;
    scanf("%lld %lld",&l,&r);
    dfs(0);
    sort(pre+1,pre+1+cnt);
//    cout<<pre[cnt-1]<<endl;
    ll sum=0;
    ll ant=0;
    for(ll i=l;i<=r;)
    {
    //    if(i>pre[ant])ant++;
    //    sum+=pre[ant];
        while(i>pre[ant])ant++;
        sum+=pre[ant]*(min(r,pre[ant])-i+1);
        i=pre[ant]+1;
    }
    printf("%lld\n",sum);
} 
全部评论
#include<bits/stdc++.h> typedef long long ll; using namespace std; vector<ll>pre; void dfs(ll n) { if(n>1e10+2)return ; pre.push_back(n); dfs(n*10+4); dfs(n*10+7); } int main() { ll r,l; ll sum=0; ll ant=0; scanf("%lld %lld",&l,&r); dfs(0); sort(pre.begin(),pre.end()); ll t1=lower_bound(pre.begin(),pre.end(),l)-pre.begin();//大于l第一个幸运数 ll t11=*lower_bound(pre.begin(),pre.end(),l); ll temp=upper_bound(pre.begin(),pre.end(),r)-pre.begin(); // cout<<t1<<" "<<temp<<endl; sum=(t11-l+1)*t11;//l之前的数 for(ll i=t1;i<=temp-2;i++){ sum+=((pre[i+1]-pre[i])*pre[i+1]); // cout<<sum<<endl; } sum+=(r-pre[temp-1])*pre[temp];//r之后的数 cout<<sum<<endl; return 0; }我按照你的思路改了一下85分,求大佬更正
点赞 回复 分享
发布于 2020-04-17 22:17

相关推荐

06-26 15:33
青岛工学院 Java
积极的秋田犬要冲国企:他现在邀请我明天面试
点赞 评论 收藏
分享
避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务