sgu108:Self-numbers II
来源:互联网 发布:阶级和阶层 知乎 编辑:程序博客网 时间:2024/06/06 00:24
用筛法来筛selfnumber,因为每位数字之和最大等于64,
hash开64位即可。
注意会出现相同的访问。
代码如下:
#include <cstdio>#include <cstring>using namespace std;const int MAXK = 5001;int N, K;int k[MAXK] = {0}, kk[MAXK];bool hash[64] = {0};int ans[MAXK] = {0}, tot = 0;int flag = 1;void sort(int l, int r){ int i = l, j = r, mid = k[l], mid2 = kk[l]; while(i < j) { while(i < j && k[j] >= mid) --j; k[i] = k[j]; kk[i] = kk[j]; while(i < j && k[i] <= mid) ++i; k[j] = k[i]; kk[j] = kk[i]; } k[i] = mid; kk[i] = mid2; if(i > l) sort(l, i - 1); if(j < r) sort(j + 1, r);}int main(){ scanf("%d%d", &N, &K); for(int i = 1; i <= K; ++i) { scanf("%d", k + i); kk[i] = i; } sort(1, K); memset(hash, true, sizeof(hash)); for(int i = 1; i <= N; ++i) { if(hash[i % 64]) { ++tot; while(tot == k[flag] && flag <= K) ans[kk[flag++]] = i;}int tmp = 0, sum = i;tmp = i;while(tmp){ sum += tmp % 10; tmp /= 10; } hash[sum % 64] = false; hash[i % 64] = true; } printf("%d\n", tot); for(int i = 1; i <= K; ++i) printf("%d ", ans[i]); return 0;}
0 0
- sgu108:Self-numbers II
- sgu108 Self-numbers II 规律
- SGU108 Self-numbers 2
- [SGU]108. Self-numbers II
- SGU 108 Self-numbers II
- SGU108
- sgu108
- sgu108
- Self Numbers
- Self Numbers
- Self Numbers
- Self Numbers
- [SGU 108]Self-numbers II(筛法活用优化+滚动数组)
- zoj1180 Self Numbers
- POJ 1316 Self Numbers
- fjnu 1884 Self Numbers
- ACM题-Self Numbers
- pku 1316 Self Numbers
- 定位
- 经典算法之七大排序总结篇
- 糊糊论道--对过滤和规则的理解
- 数据库Oracle强化练习之多表查询
- LCD的接口类型详解
- sgu108:Self-numbers II
- HDU2586
- MFC中CEdit控件实现多行,并且可在界面进行修改
- 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置(永久配置)
- template <typename T> inline T Vector<T>::min_val() const
- 抽象类的子类可以new
- 2036 改革春风吹满地
- cloudsim--ubuntu下,下载和安装cloudsim
- linux 系统编程-学习笔记8--信号/线程