Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #pragma GCC target("avx2")
- #pragma GCC optimize("Ofast")
- #include <iostream>
- #include <algorithm>
- #include <string>
- #include <cmath>
- #include <iomanip>
- #include <vector>
- #include <set>
- #include <map>
- using namespace std;
- const int N = 1005,K = 10, M = 1e9 + 7;
- int dp[11][1010][1010], k, q, t, n, op;
- struct Sost {
- int op, r, sum, l;
- };
- Sost p[11][1010][1010], best[1010];
- bool minim(int& a, int b) {
- if (a > b) {
- a = b;
- return true;
- }
- return false;
- }
- signed main()
- {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- //freopen("trains.out", "w", stdout);
- #else
- //freopen("sequence.in", "r", stdin);
- //freopen("sequence.out", "w", stdout);
- #endif
- cin >> k >> q;
- for (int l = 0; l <= K; l++) {
- for (int sumt = 0; sumt <= N; sumt++) {
- for (int suml = 0; suml <= N; suml++) {
- dp[l][sumt][suml] = 200;
- }
- }
- }
- for (int i = 0; i < N; i++) {
- best[i] = { 200,0,0 };
- }
- dp[0][0][0] = 0;
- for (int l = 0; l < K; l++) {
- for (int sumt = 0; sumt <= N; sumt++) {
- for (int suml = 0; suml <= N; suml++) {
- if (best[sumt].op > dp[l][sumt][suml]) {
- best[sumt] = { dp[l][sumt][suml],l,sumt,suml};
- }
- if (minim(dp[l][sumt + 1][suml], dp[l][sumt][suml] + 1)) {
- p[l][sumt+ 1][suml] = { 1,l,sumt, -1 };
- }
- if (sumt + suml <= N && l < k && minim(dp[l + 1][0][sumt + suml], dp[l][sumt][suml])) {
- p[l + 1][0][sumt + suml] = { 0, l, suml, -1 };
- }
- if (sumt + suml <= N && minim(dp[l][sumt + suml][suml], dp[l][sumt][suml] + 1)) {
- p[l][sumt + suml][suml] = { 2, l, sumt, -1 };
- }
- }
- }
- }
- cin >> t;
- for (int I = 0; I < t; I++) {
- cin >> n;
- vector<Sost> ans;
- int l = best[n].r;
- int sumt = best[n].sum;
- int suml = best[n].l;
- while (l != 0 || sumt != 0 || suml != 0) {
- if (p[l][sumt][suml].op == 1) {
- ans.push_back({ 0, l + 1, -1, -1 });
- sumt--;
- continue;
- }
- if (p[l][sumt][suml].op == 0) {
- int sml = p[l][sumt][suml].sum;
- sumt = suml - sml;
- suml = sml;
- l--;
- continue;
- }
- if (p[l][sumt][suml].op == 2) {
- ans.push_back({ 1, l + 1, -1, -1 });
- sumt = p[l][sumt][suml].sum;
- }
- }
- cout << best[n].op << "\n";
- for (int i = ans.size() - 1; i >= 0; i--) {
- cout << ans[i].op << " " << ans[i].r << "\n";
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment