2020.12.14vj補題
A. Lucky Ticket
題意:就是說4與7是幸運數字,用4和7組成的數字也是幸運數字,問所給數字是不是幸運數字
思路:直接敲
程式碼:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 int main(){ 8 int n; 9 scanf("%d",&n); 10 int a[150]; 11 int sum=0,sum1=0,sum2=0; 12 for(int i=1;i<=n;i++){ 13 int num=0; 14 scanf("%1d",&num); 15 if(num==4){ 16 sum++; 17 if(i<=n/2){ 18 sum1+=num; 19 }else{ 20 sum2+=num; 21 } 22 }elseif(num==7){ 23 sum++; 24 if(i<=n/2){ 25 sum1+=num; 26 }else{ 27 sum2+=num; 28 } 29 } 30 } 31 if(sum==n&&sum1==sum2){ 32 printf("YES"); 33 }else{ 34 printf("NO"); 35 } 36 }
B. Lucky Mask
題意:4和7是幸運數字,由4和7組成的數字也是幸運數字,現在有一種新的加密運算,例如給定4567,則其值是47,現在給定a和b,其值是b並且大於a的這個數是多少
思路:反向思維,一個是進行累加運算,一個一個的去對結果,從a開始加一,如果符合就直接輸出,二是如果他們得到的加密雲算相等就進行輸出
wa掉的點:1.總以為是有規律的,其實這樣的分類情況有好多,一開始以為只是新增1就行,並不是,77和7這組數就應該輸出78;2.不應該從給定的判斷條件入手找,應該先從判斷是不是大於a開始,也就是說應該調整一下想問題時,判斷條件的先後問題
程式碼:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std;//50 7 int main(){ 8 int a,b; 9 scanf("%d %d",&a,&b); 10 //int num; 11 int m=0; 12 while(b){ 13 if(b%10==4||b%10==7){ 14 m=m*10+b%10; 15 } 16 b/=10; 17 } 18 19 int s=0; 20 int flag=0; 21 for(int i=a+1;;i++){ 22 s=0; 23 24 25 int d=i; 26 while(d){ 27 if(d%10==4||d%10==7){ 28 s=s*10+d%10; 29 } 30 d/=10; 31 } 32 if(s==m){ 33 flag=i; 34 break; 35 } 36 } 37 38 printf("%d",flag); 39 }View Code
C. Lucky Conversion
題意:4和7是幸運數字,現在給定兩個字串a和b,可以執行兩種操作,1)將裡面的4替換為7,將裡面的7替換為4;2)交換a字串中任何一對位置,問從字串a到字串b要經過最少多少步
思路:統計a和b中不同的4和7,然後直接輸出大的那個
程式碼:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std;//50 7 const int maxx=1e5+10; 8 int main(){ 9 char s1[maxx],s2[maxx]; 10 scanf("%s",&s1); 11 scanf("%s",&s2); 12 int len1=strlen(s1),len2=strlen(s2); 13 int s=0,q=0; 14 for(int i=0;i<len1;i++){ 15 if(s1[i]==s2[i]){ 16 continue; 17 }else{ 18 if(s1[i]=='4'){ 19 s++; 20 }else if(s1[i]=='7'){ 21 q++; 22 } 23 } 24 } 25 printf("%d",max(q,s)); 26 }View Code
D.Lucky Number 2
題意:就是給定了了一串數字,這串數字由4和7組成,並且有a1個4,a2個7,a3個47,a4個74,給定a1--a4,問這串數字最小是多少
思路:讀錯了題,不知道47必須是緊挨著的,後悔!大致思路就是個找規律,從題目中知道這是僅有4和7,如果你寫4747這種夾雜任意4和7的字串就能知道:當以4開頭以4結尾的時候47和74一樣多,當以7開頭以7結尾的時候74和47一樣多,當以4開頭以7結尾或者以7開頭以4結尾的時候47和74一樣多,並且47和74最多隻能差1,這樣就可以對這些數進行分類:
1.當47的個數>74的個數:一定是44444..474747777保證最小
2.當47的個數<74的個數:一定是7444...474747777保證最小
3.當47的個數=74的個數:一定是4444474747....774保證最小
程式碼:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std;//50 7 int main(){ 8 int a1,a2,a3,a4; 9 scanf("%d %d %d %d",&a1,&a2,&a3,&a4);//a3--47 10 if(abs(a3-a4)>1){ 11 printf("-1\n"); 12 }else if (a3 == a4){ 13 if (a1<2&&a2<2){ 14 printf("-1\n"); 15 16 }else if (a1-1>=a3&&a2>=a3){ 17 a1=a1-a3-1; 18 a2=a2-a3; 19 for(int i=1;i<=a1;i++) printf("4"); 20 for(int i=1;i<=a3;i++) printf("47"); 21 for(int i=1;i<=a2;i++) printf("7"); 22 printf("4\n"); 23 24 }else if (a2-1>=a3&&a1>=a3){ 25 a2=a2-1-a3; 26 printf("7"); 27 for (int i=1;i<=a3;i++) printf("47"); 28 for (int i=1;i<=a2;i++) printf("7"); 29 printf("\n"); 30 31 }else{ 32 printf("-1\n"); 33 34 } 35 }else if(a3>a4){ 36 a1=a1-a3; 37 a2=a2-a3; 38 if(a1<0||a2<0){printf("-1\n");} 39 for (int i=1;i<=a1;i++) printf("4"); 40 for (int i=1;i<=a3;i++) printf("47"); 41 for (int i=1;i<=a2;i++) printf("7"); 42 printf("\n"); 43 }else{ 44 a1=a1-a4; 45 a1=a2-a4; 46 if(a1<0||a2<0){printf("-1\n");} 47 printf("7"); 48 for (int i = 1; i <= a1; i++) printf("4"); 49 for (int i = 1; i <= a3; i++) printf("47"); 50 for (int i = 1; i <= a2; i++) printf("7"); 51 printf("4\n"); 52 } 53 }View Code