sgu 对内存的限制比较大,才2M。这个题主要是用时间换空间。 /* ID: mnlm1991 PROG: sgu 108 Self-numbers 2 LANG: C++ */ #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<vector> #include<algorithm> #include<string> #include<map> #include<set> #include<bitset> #include<queue> #include<iostream> using namespace std; bool visited[64]; int N; int K; int a[5001]; struct DATA { int d; int l; bool operator < (const DATA & other) const { return d < other.d; } }s[5001]; const int MOD = 64; int main() { while (scanf("%d%d", &N, &K) != EOF) { int i; for (i = 0; i < K; i++) { scanf("%d", &s[i].d); s[i].l = i; } sort(s, s + K); int l = 0; int j = 0; memset(visited, 0, sizeof(visited)); for (i = 1; i <= N; i++) { if (visited[i % MOD]) { visited[i % MOD] = false; } else { if (l == s[j].d - 1) { while (l == s[j].d - 1) { a[s[j++].l] = i; } } l++; } int tmp = 0; int j = i; while (j) { tmp += j % 10; j /= 10; } visited[(i + tmp)% MOD] = true; } printf("%d/n", l); for (i = 0; i < K - 1; i++) { printf("%d ", a[i]); } printf("%d/n", a[i]); } return 0; }