Task: | Numerot |
Sender: | kluopaja |
Submission time: | 2020-10-18 22:57:35 +0300 |
Language: | C++ (C++11) |
Status: | READY |
Result: | 0 |
group | verdict | score |
---|---|---|
#1 | TIME LIMIT EXCEEDED | 0 |
#2 | TIME LIMIT EXCEEDED | 0 |
#3 | TIME LIMIT EXCEEDED | 0 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | TIME LIMIT EXCEEDED | -- | 1, 2, 3 | details |
#2 | TIME LIMIT EXCEEDED | -- | 2, 3 | details |
#3 | TIME LIMIT EXCEEDED | -- | 3 | details |
Compiler report
input/code.cpp: In function 'int f(int)': input/code.cpp:18:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for(int i = 0; i < s.size(); ++i) { ~~^~~~~~~~~~ input/code.cpp: In function 'std::pair<long long int, long long int> f_nines(ll)': input/code.cpp:79:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for(int i = 0; i < s.size(); ++i) { ~~^~~~~~~~~~ input/code.cpp:93:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for(int j = 0; j < s.size(); ++j) s[j] += '0'; ~~^~~~~~~~~~ input/code.cpp: In function 'll get_max(ll)': input/code.cpp:109:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for(int i = 0; i < s.size(); ++i) ma = max(ma, (ll)s[i]-'0'); ~~^~~~~~~~~~ input/code.cpp: In function 'll f2(ll)': input/code.cpp:113:6: warning: unu...
Code
#include <iostream> #include <cassert> #include <cmath> #include <sstream> #include <cstring> using namespace std; using ll = long long; int dp[1000100]; int f(int n) { if(n == 0) return 0; if(dp[n] != -1) return dp[n]; stringstream ss; ss << n; string s; ss >> s; dp[n] = 1e9; for(int i = 0; i < s.size(); ++i) { dp[n] = min(dp[n], f(n - (s[i] - '0')) + 1); } return dp[n]; } // max_n, len, last_d // len // ...,max_n, ..., {9, ..., last_d} // // {steps, last_digit} // to // ..., max_n, ..., {0, 0, 0, last_digit} pair<ll, ll> dp2[10][20][10]; pair<ll, ll> fast_f(ll max_n, ll len, ll last_d) { if(dp2[max_n][len][last_d].first != -1) { return dp2[max_n][len][last_d]; } ll last_d_copy = last_d; if(len == 1) { return make_pair(0ll, last_d); } ll steps = 0; for(ll i = 9; i >= 0; --i) { ll new_max_n = max(max_n, i); auto tmp = fast_f(new_max_n, len-1, last_d); if(i > 0) { steps += tmp.first; // i000x --> i000 if(tmp.second >= new_max_n) { // note that new_max_n > 0 ++steps; // i0000 - new_max_n // (i-1)999... last_d = 10 - new_max_n; ++steps; } // i000x --> (i-1)000y else { last_d = 10+tmp.second-new_max_n; ++steps; } } else { steps += tmp.first; dp2[max_n][len][last_d_copy] = {steps, tmp.second}; return dp2[max_n][len][last_d_copy]; } } assert(0); } int brute(int x) { for(int i = 1; ; ++i) { if(f(i) == x) return i; } } pair<ll, ll> f_nines(ll x) { stringstream ss; ss << x; string s; ss >> s; int max_n[20] = {0}; for(int i = 0; i < s.size(); ++i) { s[i] -= '0'; max_n[i+1] = max(max_n[i],(int) s[i]); } ll nn = s.size(); ll nines = 0; for(int i = nn-2; i >=0; --i) { if(s[i] == 9) { s[i] = 0; ++nines; } else { auto x = fast_f(max_n[i+1], nines+1, s[nn-1]); s[nn-1] = x.second; for(int j = 0; j < s.size(); ++j) s[j] += '0'; stringstream s2; s2 << s; ll out; s2 >> out; return {x.first, out}; break; } } } ll get_max(ll x) { stringstream ss; ss << x; string s; ss>>s; ll ma = 0; for(int i = 0; i < s.size(); ++i) ma = max(ma, (ll)s[i]-'0'); return ma; } ll f2(ll x) { ll q = 1; ll steps = 0; while(x > 0) { if(x < 10) { return steps + 1; } ll y = x/10; if(y %10 != 9) { x -= get_max(x); ++steps; } else { auto tmp = f_nines(x); x = tmp.second; steps += tmp.first; } } } int main() { memset(dp, -1, sizeof(dp)); for(int i = 0; i < 10; ++i) { for(int j = 0; j < 20; ++j) { for(int k = 0; k < 10; ++k) { dp2[i][j][k] = {-1ll, 0ll}; } } } int tt; cin>>tt; for(int xx = 0; xx < tt; ++xx) { ll x; cin>>x; ll lo = 0; ll hi = 5e17; ll best = hi; while(lo <= hi) { ll mid = (lo+hi)/2; if(f2(mid) >= x) { hi = mid-1; best = mid; } else { lo = mid+1; } } cout<<best<<endl; } }
Test details
Test 1
Group: 1, 2, 3
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 1 2 3 4 ... |
correct output |
---|
1 10 11 20 22 ... |
user output |
---|
(empty) |
Test 2
Group: 2, 3
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 224995 413660 249827 2125 ... |
correct output |
---|
1731724 3216040 1940719 14585 532612 ... |
user output |
---|
(empty) |
Test 3
Group: 3
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 627887018110416188 785474884983906653 653772166720939773 784335285960673683 ... |
correct output |
---|
5530371754830260284 6918696171534226533 5757755627065159149 6908439780325129803 3223801064342340738 ... |
user output |
---|
(empty) |