题目链接:
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
ztr喜欢幸运数字,他对于幸运数字有两个要求 1:十进制表示法下只包含4、7 2:十进制表示法下4和7的数量相等 比如47,474477就是 而4,744,467则不是 现在ztr想知道最小的但不小于n的幸运数字是多少
输入描述
有TT(1≤T≤10?5??)组数据,每组数据一个正整数n,n<=10^18}1≤n≤10?^18??
输出描述
有TT行,每行即答案
输入样例
2 4500 47
输出样例
4747 47 题意: 思路: 分情况讨论呗,d个毛线dfs,还二分,贪心就能搞定;比赛的时候数据出了0,最后也没改过来,哎,BC确实没有CF做的好; AC代码:
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; const int N=1e5+6; const LL mod=1e9+7; const double PI=acos(-1.0); int a[30],b[30]; int check(int x) { for(int i=0;i<x/2;i++) { if(b[i]<7)return 1; else if(b[i]>7)return 0; else { continue; } } for(int i=x/2;i<x;i++) { if(b[i]<4)return 1; else if(b[i]>4)return 0; else continue; } return 1; } int main() { int t; scanf("%d",&t); LL n; while(t--) { scanf("%I64d",&n); LL m=n; int cnt=0,num=0; while(m) { a[cnt++]=m%10; m/=10; } for(int i=cnt-1;i>=0;i--) { b[num++]=a[i]; } if(n<=0)printf("47"); else { if(num%2==1) { num++; int flag1=num/2; for(int i=1;i<=flag1;i++) { printf("4"); } for(int i=1;i<=flag1;i++) { printf("7"); } } else { if(check(num)==0) { num+=2; for(int i=0;i<num/2;i++) { printf("4"); } for(int i=0;i<num/2;i++) { printf("7"); } } else { int vis1=num/2,vis2=num/2; for(int i=0;i<num;i++) { if(b[i]>4&&b[i]<7) { printf("7"); vis2--; for(int j=0;j<vis1;j++) printf("4"); for(int j=0;j<vis2;j++) printf("7"); break; } else if(b[i]==7) { printf("7"); vis2--; } else if(b[i]<4) { if(vis1) { printf("4"); vis1--; for(int j=0;j<vis1;j++)printf("4"); for(int j=0;j<vis2;j++)printf("7"); break; } else { for(int j=0;j<vis2;j++)printf("7"); break; } } else { LL ans1=0,ans2=0; for(int j=0;j<vis2;j++) { ans1=ans1*10+7; } for(int j=0;j<vis1-1;j++) { ans1=ans1*10+4; } for(int j=i+1;j<num;j++) { ans2=ans2*10+b[j]; } if(ans2<=ans1&&vis1) { printf("4"); vis1--; } else { // cout<<"@"<<endl; //cout<<vis1<<" "<<vis2<<"#"<<endl; printf("7"); vis2--; for(int j=0;j<vis1;j++) { printf("4"); } for(int j=0;j<vis2;j++) { printf("7"); } break; } } } } } } printf("\n"); } return 0; }
时间: 2024-10-06 02:45:28