***个人认为这4题出的相当好!

定义:   一个数的数位上数字均是4或7,称为‘幸运数’;

幸运数字I

题意:求出字符串s的出现最多次数的幸运子串,有多个,求字典序最小的。

任何幸运数都由4和7组成,考虑字典序最小,满足题意的幸运子串的长度为1;

例:44由4构成,4出现一定不小于其2倍;77同理;47由4和7组成,4出现的次数不小于47,且4的字典序小于7、47;


所以有答案一定是4或者7;

   num_4==0&&num_7==0,  无幸运数,输出“-1”;

   num_4>=num_7,输出"4";

   num_4 < num_7,输出"7";

#include <iostream>
#include <string.h>
using namespace std;int main()
{string s;cin>>s;int a=0,b=0;for(int i=0;i<s.length();++i)if(s[i]=='4')++a;else if(s[i]=='7')++b;if(a==0&&b==0)cout<<-1<<endl;else if(a>=b){cout<<4<<endl;}else {cout<<7<<endl;}return 0;
}

幸运数字II

题意:定义next(x)不小于x的第一个幸运数字,求区间[l,r]内所有数的next的和;(r<=1e9)

千万不要走进数位dp的坑!

不大于next(1e9)的幸运数的个数不超过1050个!  记ai为所有4位数的幸运数的个数,a1=2;

ai+1  =    ai  (第i+1位放4) +  ai  (第i+1位放7),得ai=2^i,  Si=2^(i+1)-2;(i<=9)

*按升序顺序求出Si个幸运数

(可以将ai中所有数字的第i+1位上添4,在添7);

但从Code的角度来说,将ai中每个数字乘10在分别加4、7更加合适!

*遍历ai,调整l,找出区间中next(x)=ai,x的个数,并调整区间左端点l=ai+1;

#include <iostream>
#include <string.h>
#include <vector>
#define llt long long
using namespace std;int main()
{llt l,r;cin>>l>>r;vector<llt> V;V.push_back(4);V.push_back(7);for(int i=2;i<=10;++i){for(int j=(1<<(i-1))-2;j<(1<<i)-2;++j){V.push_back(V[j]*10+4);V.push_back(V[j]*10+7);}}llt ans=0;for(int i=0;i<V.size();++i){//if(l>=r)break;if(V[i]<l)continue;if(V[i]>=r){ans+=(r-l+1)*V[i];break;}ans+=V[i]*(V[i]-l+1);l=V[i]+1;}cout<<ans<<endl;return 0;
}

幸运数字III

题意:数字字符串d1d2……dn,对其进行k次操作,每次操作:找出最左侧的dxdx+1="47";

*x为奇数,将dxdx+1变为“44”

*x为偶数,将dxdx+1变为“77”

输出最后的字符串;

遍历字符串,遇到di=‘4’,即测试一下di+1是否为‘7’,如果不为‘7’,即继续遍历;如果di+1==‘7’:

讨论:i为奇数,将di+1变为‘4’,继续向下遍历;

i为偶数,将di变为‘7’,di-1为‘7’,继续向下遍历,如果di-1为‘4’,(i-1奇、i偶、i+1奇)

那么477-->447--->477--->447,操作会在此处以2循环下去,仅需判断此时k的奇偶,k为偶不变,k为奇仅操作1次;

时间复杂度变为O(len)非O(k)!

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define llt long long
using namespace std;char  s[100010];
int main()
{int n,k;cin>>n>>k;scanf("%s",s);int l=1;while(k){if(l>=n){break;}if(s[l-1]!='4'||s[l]!='7'){++l;continue;}--k;if(l%2==1) {s[l]='4';++l;continue;}s[l-1]='7';if(s[l-2]=='4'){if(k%2){s[l-1]='4';}break;}}printf("%s",s);}

幸运数字IV

题意:数字1……n的第k小排序中,数字即其位置均为幸运数字的个数;(k<=1e9)

如果n!<k,输出-1!

1e9 对n!来说是个小数字,13!>k;  n很大时,前面1……(n-13)的顺序不变,我们考虑的仅仅是13个数字的顺序!

***求出1……13的阶乘a;将需要排序的最后数字放入b数组;

***如果n>13的话,我们需要求出前n-13个数字中幸运数字的个数,将r=n-13的所有数位求出,最高位temp-1为0的

幸运数个数S=2^temp-2;ans+=S;下面的所有幸运数中不能在有数位0!只允许4和7!

从高位i开始,dight[i]<4 ,return;  (第i位不能取到4或7,结束!)

dight[i]==4,  ans+=(i==0),继续遍历,(i==0,即结束了遍历,前面数位和最后的数位均为4和7,即r为幸运数)

ans+=2^i(即第i位为4,其它数位任取4和7,幸运数的个数)

dight[i]<7(第i位不能取到'7',结束!)

dight[i]==7,  ans+=(i==0),继续遍历,(i==0,即结束了遍历,前面数位和最后的数位均为4和7,即r为幸运数)

ans+=2^i(即第i位为7,其它数位任取4和7,幸运数的个数)

return;(已经讨论完全,第i位为8、9绝对不是幸运数)

***对剩下的数进行排序,如果(i-1)*a[len-1]<k<=i*a[len-1],即此时因排bi于此时首位!将bi删去,len减1,

k-=(i-1)*a[len-1];        判断 :bi和其位置start是否都是幸运数,是,ans++;直到len为0,就结束!

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#define llt long long
#define Size 100010
using namespace std;int a[15];
int b[15];
int n,k,start,len;
int ans=0;bool isUNF(int x){while(x){if(x%10!=4&&x%10!=7)return false;x/=10;}return true;
}void Havenum(int x){int dight[12];int temp=0;while(x){dight[temp++]=x%10;x/=10;}ans=(1<<temp)-2;for(int i=temp-1;i>=0;--i){//printf("%d\n",ans);if(dight[i]<4)return;if(dight[i]==4){ans+=(i==0);continue;}ans+=(1<<i);if(dight[i]<7) return;if(dight[i]==7){ans+=(i==0);continue;}ans+=1<<i;return ;}
}
void init(){a[0]=1;for(int i=1;i<=13;++i)a[i]=a[i-1]*i;//printf("%d\n",a[13]);start=1;if(n>13){start=n-12;Havenum(n-13);}len=0;for(int i=start;i<=n;++i) b[++len]=i;
}void Delete(int x){for(int i=x;i<len;++i) b[i]=b[i+1];--len;
}
int main()
{scanf("%d%d",&n,&k);init();if(n<=13&&k>a[n]) printf("-1\n");else{//printf("%d\n",ans);while(start<=n){int i;for(i=1;;++i) if(k<=i*a[len-1])break;k-=(i-1)*a[len-1];if(isUNF(start)&&isUNF(b[i]))++ans;Delete(i);++start;}printf("%d\n",ans);}return 0;
}

牛客练习赛13 幸运数系列相关推荐

  1. 牛客网 牛客练习赛13 A.幸运数字Ⅰ

    A.幸运数字Ⅰ 链接:https://www.nowcoder.com/acm/contest/70/A 来源:牛客网 水题. 代码: 1 #include<iostream> 2 #in ...

  2. 牛客网 牛客练习赛13 C.幸运数字Ⅲ-思维

    C.幸运数字Ⅲ 链接:https://www.nowcoder.com/acm/contest/70/C 来源:牛客网 这个题447和477是特殊的,其他的就没什么了. 代码: 1 #include& ...

  3. 【牛客练习赛13】 A B C D【康拓展开】 E【DP or 记忆化搜索】 F 【思维】

    A 幸运数字Ⅰ 链接:https://www.nowcoder.com/acm/contest/70/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K, ...

  4. 牛客练习赛 A-有理数 B-硬币

    链接:https://www.nowcoder.com/acm/contest/69/A 来源:牛客网 题目描述 有一个问题如下:     给你一个有理数v,请找到小于v的最大有理数.     但这个 ...

  5. 牛客练习赛13题目题解

    A-幸运数字I /******************************************************* Data: 2017/3/16 19:19:10 Author: We ...

  6. 牛客练习赛13 B 幸运数字Ⅱ 【暴力】【二分】

    题目链接 https://www.nowcoder.com/acm/contest/70/B 思路 没有代码限制 先打表 打出 幸运数字的表 然后 二分查找 第一个 大于 r 的幸运数字 然后 往 L ...

  7. 牛客练习赛27 F-计数(状压+限制初末状态的矩阵快速幂)

    传送门 假如不是环,很简单 定义f[i][j]f[i][j]f[i][j]枚举到第iii个数字最后五个数字状态是jjj 那么显然可以矩阵快速幂求解 初始矩阵aaa是111行(1<<m)−1 ...

  8. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  9. 牛客练习赛34 E little w and Digital Root(数位dp)

    title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...

最新文章

  1. [hdu6434]Problem I. Count
  2. MoSCow和Kano
  3. headroom.js插件使用方法
  4. SageMaker 超参数优化作业
  5. 从零开始学习ASP.NET MVC1.O (第一章)
  6. Jquery跨域调用(JSONP)遇到error问题的解决
  7. 《锋利的jQuery》随笔(一)
  8. C语言读写txt文件
  9. 工商企业大数据爬虫系统
  10. 初学ARX的人可能会遇到此问题,ObjectARX 2010必须在VS2008SP1中安装,默认安装完后是没有中文包的,
  11. 工作中提升效率的工具
  12. eas库存状态调整单不能反审核_金蝶eas凭证无法审核
  13. Linux中samba配置和windows映射Linux驱动盘
  14. HDU (多校) Kejin Player HDU 6656
  15. 对接医疗资源,创建高质量医疗数据库,这家公司能降低跨境医疗费用吗?
  16. 华科教授因学生住宿问题投诉后勤处:被学校处分,取消两年评优资格
  17. 黑苹果alc269声卡仿冒id_Alc269声卡的一些信息
  18. matlab中对一个信号加指定信噪比的噪声
  19. 2020年《财富》中国500强排行榜数据爬取,看看都有哪些
  20. MathWorks官方MATLAB/Simulink基础入门视频教程 笔记(Simulink基础)

热门文章

  1. 点线图和阶梯图的画法
  2. wltc循环多少公里_究竟是不是大忽悠?聊聊官方续航里程的含金量!
  3. Ubuntu如何创建并执行python文件
  4. 计算机视觉-目标检测论文中proposal翻译理解
  5. 一天一道LeetCode(61-90)
  6. 上csdn 论坛首页了
  7. el-tree 动态图标
  8. FSN联合CoinEX举行的AMA圆满结束时DYDX期货TVL突破800万U
  9. [Hadoop集群模式安装与配置全过程]红帽子RatHat6下hadoop集群模式安装(3个节点,master,slave1,slave2)
  10. 小米2s 白色电信版 线刷教程亲身经历