A(题解看注释)
#include <bits/stdc++.h> #define P pair<int, int> using namespace std; struct mp { int p[7][7]; bool friend operator <(const mp &a, const mp &b) { for (int i =1 ; i <= 6; ++i) for (int j = 1; j <= 6; ++j) if (a.p[i][j] != b.p[i][j]) return a.p[i][j] < b.p[i][j]; return false; } }; struct node { P a[11], b[11]; // a【i】表示第i辆车的车头坐标,b【i】车尾 int cnt; mp p; }c; int n, ans = -1; int d[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; // 方向 set<mp> st; //剪枝 queue<node> q; bool move(node &res, int id, int de) { P &a = res.a[id], &b = res.b[id]; mp &p = res.p; if (a.first == b.first && de > 1) return false; //移动不合法 if (a.second == b.second && de < 2) return false; a.first += d[de][0], a.second += d[de][1]; if (a.first < 1 || a.first > 6 || a.second < 1|| a.second > 6) return false; if (p.p[a.first][a.second] != id && p.p[a.first][a.second] != 0) return false; b.first += d[de][0], b.second += d[de][1]; if (b.first < 1 || b.first > 6 || b.second < 1|| b.second > 6) return false; if (p.p[b.first][b.second] != id && p.p[b.first][b.second] != 0) return false; if (de == 0 || de == 2) p.p[a.first - d[de][0]][a.second - d[de][1]] = 0, p.p[b.first][b.second] = id; else if (de == 1 || de == 3) p.p[b.first - d[de][0]][b.second - d[de][1]] = 0, p.p[a.first][a.second] = id; return true; } int main() { for (int i = 1; i <= 6; ++i) for (int j = 1; j <= 6; ++j) { int m; cin >> m; //以后尽量用cin if (!m) continue; if (c.a[m].first == 0) c.a[m] = {i, j}; else c.b[m] = {i, j}; n = max(n, m); // 有几辆车 c.p.p[i][j] = m; } st.insert(c.p), q.push(c); while (!q.empty()) { c = q.front(); q.pop(); if (c.a[1] == make_pair(3, 5) && c.b[1] == make_pair(3, 6)) { ans = c.cnt + 2; break;} if (c.cnt >= 8) continue; //剪枝 for (int i = 1; i <= n; ++i) for (int j = 0; j < 4; ++j) //方向 { node res = c; ++res.cnt; if (move(res, i, j)) if (st.count(res.p)) continue; else st.insert(res.p), q.push(res); } } printf("%d", ans); return 0; }
C
#include <bits/stdc++.h> using namespace std; int n, a[55], flag; int main() { cin >> n; for (int i = 1; i <= n; ++i) cin >> a[i]; for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (i != j) for (int k = j + 1; k <= n; ++k) if (i != k) if ((a[k] - a[j]) % a[i]) flag = 1; if (flag) puts("no"); else puts("yes"); return 0; }
D
#include <bits/stdc++.h> using namespace std; char a[10] = "bubble", b[10] = "tapioka", s[10000000]; int main() { int flag = 1; while (cin >> s) if (strcmp(a, s) && strcmp(b, s)) cout << s << ' ', flag = 0; if (flag) cout << "nothing"; return 0; }
E
#include <bits/stdc++.h> using namespace std; const int maxn = 1e6; int t, k, len, n; int a[2000]; int main() { cin >>t; a[1] = -1; while (t--) { cin >> k >> len; n = 2; if (len >= 2000) {puts("-1"); continue;} int sum = max((k - 1) / maxn + 3, len); k = k + sum; for (int &i = n; i <= len || k > 0; ++i) if (k >= 1e6) a[i] = 1e6, k -= 1e6; else if (k > 0) a[i] = k, k = 0; else a[i] = 0; cout << n - 1 << ' '; for (int i = 1; i < n; ++i) cout << a[i] << ' '; puts(""); } return 0; }
H
#include <bits/stdc++.h> #define ll long long using namespace std; int t, n; int main() { cin >> t; while (t--) { cin >> n; cout << ((ll)n * (n + 1) ^ (n + 1)) << ' '; } return 0; }
J
#include <bits/stdc++.h> using namespace std; int s[505], t, n, m, mp[16][505], v[505], ans; vector<int> ve[505]; bool cmp(int a, int b) { return ve[a].size() < ve[b].size(); } void dfs(int k, int tot) { while (k <= n && v[s[k]]) ++k; if (k > n) { ans = min(ans, tot); return; } if (tot + 1 >= ans) return; for (int i = 0; i < ve[s[k]].size(); ++i) { int& id = ve[s[k]][i]; for (int j = 1; j <= n; ++j) v[j] += mp[id][j]; dfs(k + 1, tot + 1); for (int j = 1; j <= n; ++j) v[j] -= mp[id][j]; } } int main() { scanf("%d", &t); while (t--) { scanf("%d%d", &n, &m); ans = m; for (int i = 1; i <= n; ++i) vector<int>().swap(ve[i]), v[i] = 0, s[i] = i; for (int i = 1; i <= m; ++i) for (int j = 1; j <= n; ++j) { char c = getchar(); while (c != '0' && c != '1') c = getchar(); if (c == '1') mp[i][j] = 1, ve[j].emplace_back(i); else mp[i][j] = 0; } sort(s + 1, s + 1 + n, cmp); if (ve[s[1]].empty()) { puts("-1"); continue; } dfs(1, 0); printf("%d ", ans); } return 0; }
K
#include <bits/stdc++.h> using namespace std; int t, n, a; priority_queue<int, vector<int>, greater<int> > q; int main() { cin >> t; while (t--) { cin >> n; while (n--) cin >> a, q.push(a); int ans = 0; while (!q.empty()) { int a = q.top(), b; q.pop(); if (!q.empty()) b = q.top(), q.pop(); else break; ans += a + b, q.push(a + b); } cout << ans << ' '; } return 0; }