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 --> i000if(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)000yelse {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) |