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 }
溜了,去写别的了。