牛客网Nowcoder 牛客练习赛13 A.幸运数字Ⅰ B.幸运数字Ⅱ(数组或者dfs) C.幸运数字Ⅲ(思维)

Posted Persistent.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客网Nowcoder 牛客练习赛13 A.幸运数字Ⅰ B.幸运数字Ⅱ(数组或者dfs) C.幸运数字Ⅲ(思维)相关的知识,希望对你有一定的参考价值。

 

A.幸运数字Ⅰ

 
 
水题。
代码:
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<cstdlib>
 7 using namespace std;
 8 char s[60];
 9 int main(){
10     cin>>s;
11     int len=strlen(s);
12     int num1=0,num2=0;
13     for(int i=0;i<len;i++){
14         if(s[i]==4)num1++;
15         if(s[i]==7)num2++;
16     }
17     if(num1>=num2&&num1!=0)cout<<"4"<<endl;
18     else if(num1<num2)cout<<"7"<<endl;
19     else cout<<"-1"<<endl;
20 }

 

 

 



B.幸运数字Ⅱ
 
 
这个题就是找出来数据范围内的所有的幸运数,然后直接区间累加起来就可以了。
两个版本,一个数组找的所有的幸运数,一个dfs找的所有的幸运数。
代码1(数组):
 1 //B-数组版
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<cstdlib>
 7 #include<algorithm>
 8 #include<queue>
 9 using namespace std;
10 typedef long long ll;
11 const int maxn=2048;
12 const int inf=1e9+10;
13 ll a[maxn];
14 ll kuaisumi(int a,int b){
15     ll ans=1;
16     while(b){
17         if(b%2==1)ans=ans*a;
18         a=a*a;
19         b=b/2;
20     }
21     return ans;
22 }
23 void fun(){
24     a[1]=4,a[2]=7;ll h=2;
25     for(ll i=2;i<=10;i++){
26         ll x=kuaisumi(2,i);
27         ll y=x/2;
28         ll z=kuaisumi(10,i-1);
29         ll k=h+1;
30         for(ll j=h-y+1;j<=h;j++){
31             a[k]=4*z+a[j];
32             a[x/2+k++]=7*z+a[j];
33         }
34         h+=x;
35     }
36 }
37 int main(){
38     fun();
39     int l,r;
40     cin>>l>>r;
41     ll ans=0;
42     for(int i=1;i<=2046;i++){
43         if(a[i]>=l){
44             if(a[i]<r){
45                 ans+=(a[i]-l+1)*a[i];
46                 l=a[i]+1;
47             }
48             else{
49                 ans+=(r-l+1)*a[i];
50                 break;
51             }
52         }
53     }
54     cout<<ans<<endl;
55 }

 

代码2(dfs):

 1 //B-DFS版
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<cstdlib>
 7 #include<algorithm>
 8 #include<queue>
 9 using namespace std;
10 typedef long long ll;
11 const int maxn=2048;
12 ll a[maxn];
13 int h=0;
14 void dfs(ll x,int c){
15     a[h++]=x;
16     if(c==9)return;
17     dfs(x*10+4,c+1);
18     dfs(x*10+7,c+1);
19 }
20 int main(){
21     a[h++]=4444444444;
22     dfs(0,0);
23     sort(a,a+h);
24     int l,r;
25     cin>>l>>r;
26     ll ans=0;
27     for(int i=0;i<h;i++){
28         if(a[i]>=l){
29             if(a[i]<r){
30                 ans+=(a[i]-l+1)*a[i];
31                 l=a[i]+1;
32             }
33             else{
34                 ans+=(r-l+1)*a[i];
35                 break;
36             }
37         }
38     }
39     cout<<ans<<endl;
40 }

 

 

 

 

 



C.幸运数字Ⅲ
 
 
 
这个题447和477是特殊的,其他的就没什么了。
代码:
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 const int maxn=1e5+10;
 8 char s[maxn];
 9 int vis[maxn];
10 int main(){
11     int n,k;
12     cin>>n>>k;
13     cin>>s+1;
14     memset(vis,0,sizeof(vis));
15     int num=0;
16     for(int i=1;i<=n;i++){
17         if(i+1<=n&&s[i]==4&&s[i+1]==7){
18             vis[i]=1;
19             num++;
20         }
21     }
22     //cout<<num<<endl;
23     if(num==0){
24         for(int i=1;i<=n;i++)
25             cout<<s[i];
26         cout<<endl;
27     }
28     else{
29         for(int i=1;i<=n;i++){
30             if(k==0)break;
31             if(vis[i]==1){
32                 if(i%2==0){
33                     if(s[i-1]==4){
34                         if(k%2==0)break;
35                         else{
36                             s[i]=7;
37                             break;
38                         }
39                     }
40                     else {k--;s[i]=7;vis[i]=0;}
41                 }
42                 else{
43                     if(s[i+2]==7){
44                         if(k%2==0)break;
45                         else{
46                             s[i+1]=4;
47                             break;
48                         }
49                     }
50                     else{k--;s[i+1]=4;vis[i]=0;}
51                 }
52             }
53         }
54     }
55     for(int i=1;i<=n;i++)
56         cout<<s[i];
57     cout<<endl;
58 }

 

 

 

 

溜了,去写别的了。

以上是关于牛客网Nowcoder 牛客练习赛13 A.幸运数字Ⅰ B.幸运数字Ⅱ(数组或者dfs) C.幸运数字Ⅲ(思维)的主要内容,如果未能解决你的问题,请参考以下文章

牛客网NowCoder 2018年全国多校算法寒假训练营练习比赛(第三场)A.不凡的夫夫(斯特林公式) D.小牛vs小客 E.进击吧!阶乘(大数Java) G.大水题(数学)

牛客网NowCoder 2018年全国多校算法寒假训练营练习比赛(第四场)A.石油采集(dfs) B.道路建设(最小生成树prim) C.求交集(暴力) F.Call to your teacher

牛客网NowCoder Wannafly挑战赛9 A.找一找(数据处理) C.列一列(sscanf)

斯特林公式-Stirling公式(取N阶乘近似值)-HDU1018-Big Number 牛客网NowCoder 2018年全国多校算法寒假训练营练习比赛(第三场)A.不凡的夫夫

牛客练习赛100 A.小红的小桃子(exgcd)

牛客练习赛100 A.小红的小桃子(exgcd)