您的位置:首页 > 其它

Gym - 100338E Numbers 贪心

2015-09-08 08:24 423 查看
Gym - 100338E

题意:给你n,k问在1-n中能整出k的字典序最小的数。范围1018

思路:比较简单的贪心了,枚举10的幂m,然后加上k-m%k, 更新答案就可以了,数据一定要用unsigned long long,我就在这里挂了几次,查了半天。

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define LL unsigned long long
#define eps 1e-8
#define INF 0x3f3f3f3f
#define MAXN 10005
using namespace std;
LL n, k;
LL m[25];
//char s[25], res[25];
vector<char> s, t, res;
int main()
{
#ifdef ONLINE_JUDGE
freopen("numbers.in", "r", stdin);
freopen("numbers.out", "w", stdout);
#endif //ONLINE_JUDGE
m[0] = 1;
for (int i = 1; i <= 19; i++){
m[i] = m[i - 1] * 10ULL;
}
while (~scanf("%I64d%I64d", &n, &k)){
if (n == 0 && k == 0) break;
for (int i = 0; i <= 19; i++){
LL p = m[i] % k == 0 ? m[i] : m[i] + k - (m[i] % k);
if (p > n) break;
if (p % k != 0) continue;
t.clear();
while (p != 0){
t.push_back(p % 10ULL + '0');
p /= 10ULL;
}
s.clear();
for (int j = t.size() - 1; j >= 0; j--){
s.push_back(t[j]);
}
if (i == 0){
res = s;
continue;
}
bool flag = true;
for (int j = 0; j < s.size(); j++){
if (res.size() < j + 1){
flag = true;
break;
}
if (s[j] > res[j]){
flag = true;
break;
}
if (s[j] == res[j]) continue;
flag = false;
break;
}
if (flag) continue;
res = s;
}
for (int i = 0; i < res.size(); i++){
printf("%c", res[i]);
}
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: