F1. Nearest Beautiful Number (easy version)
题目
找一个只有1个或2个数字构成的数 ,保证其大于或等于n
思路
找到所有可能的数,二分它们
AC代码
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N =10 + 1e5 ,mod=1e9 + 7;
set<ll> a,b;
void init()// 取出所有可能数字
{
// k == 1
for(int i = 0 ;i<10;i++)
{
ll cur = 0;
for(int j =1 ; j <=10; j++)
{
cur = cur * 10 + i ;
a.insert(cur);
}
}
// k == 2
for(int i = 0 ;i <10 ;i++)// at most 10^7
for(int j = i + 1; j < 10; j++)// 我们规定 i< j
for(int k =1 ;k <=10 ; k++)// 枚举位数
{
for(int l = 0 ;l <(1 << k) ; l++) // 二进制枚举 0 代表 j 1代表 i
{
ll cur = 0 ;
for(int m = k - 1 ; m >=0 ; m--)// 取出每一位
{
if(l >> m & 1)
cur =cur * 10 + i;
else cur =cur * 10 +j;
}
b.insert(cur);
}
}
}
void solve()
{
int n,k;
cin >> n >> k;
if( k == 1)
cout<< *a.lower_bound(n) <<endl ;// 返回第一个大于或等于n的 upper_bound 返回大于的
else cout<< *b.lower_bound(n) <<endl;
}
signed main()
{
ios::sync_with_stdio();
init();
int T;cin>>T;
int T1=clock();
while(T--)
solve();
int T2=clock();
cerr<<endl<<" Time : "<< T2-T1 <<"ms."<<endl;
return 0;
}