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,我就在这里挂了几次,查了半天。
题意:给你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"); } }
相关文章推荐
- Properties类用于配置的
- 链表,多项式求和
- Apple 如何知道你使用了私有API
- 打印流printstream
- SQL 自动清除7天前数据前收缩数据库
- mysql基础2
- 对指定的目录进行递归获取递归过程所有的java文件的路径。
- 数据结构例程——线性表顺序存储的应用
- 代理的回调的例子
- Wix 安装部署教程(十五) --CustomAction的七种用法
- 罗辑思维
- 遍历递归目录下所有文件或文件夹
- file文件创建等
- 关于在C++中调用system函数
- mysql基础学习1
- 面试题摘选
- android学习—context 和 getApplicationContext()
- 剑指Offer系列---(8)重建二叉树
- hdoj1043,eight
- Android xUtils框架(二) ViewUtils