2024.12.9 週一
Q1. 1000
問是否可以用給定的n^2個數構造出已定n*n的矩陣。
Q2. 1200
給定2行n列陣列,從(1,1)走到(2,n),只能向右/下走。你可以任意交換2列,問經過元素的和的最大值。
Q3. 1200
你有任意張面值為1,3,6,10,15的紙幣。給定n,問湊出n元需要最小的紙幣張數。
Q4. 1400
給定字元迷宮,問作為起點無法出迷宮的位置數。
------------------------獨自思考分割線------------------------
-
被Q3卡了。一個半小時結束,Q1+Q2半小時,Q3半小時,速度還可以。深搜比廣搜確實好寫...
A1. 2點
1.資料結構map維護個數,一一判斷。
2.另解:生成矩陣判等。
A2. 2點
1.2行註定有一個拐點。任意交換列代表可以任意排列。
2.分析本質:任意選擇n-1個max(a[i][0],a[i][1]),加上拐點的另一半,顯然未被選擇的最大值最優。
A3.
1. 好題:思維+暴力 / dp+貪心
A4. 2點
1.反向搜尋必出迷宮的塊。
2.搜尋剩下塊:對每個塊數量>1就可以做到無法出迷宮。
------------------------程式碼分割線------------------------
A1.
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // 互動/除錯 關
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(6);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n, c, d;
cin >> n >> c >> d;
map<int, int> has;
for (int i = 0; i < n * n; i++)
{
int x;
cin >> x;
has[x]++;
}
int minw = (*has.begin()).first;
int ans = 1;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
if (!has[minw + i * c + j * d])
ans = 0;
else
has[minw + i * c + j * d]--;
}
cout << (ans ? "YES" : "NO") << endl;
}
A2.
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // 互動/除錯 關
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(6);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int m;
cin >> m;
vector<pair<int, int>> vec(m);
for (auto &[x, y] : vec)
cin >> x;
for (auto &[x, y] : vec)
cin >> y;
int sum = 0, maxw = -1e12;
for (auto [x, y] : vec)
{
maxw = max(maxw, min(x, y));
sum += max(x, y);
}
cout << sum + maxw << endl;
}
A3.
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // 互動/除錯 關
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(6);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n;
cin >> n;
int res = 1e12;
vector<int> vec{15, 10, 6, 3, 1};
int cnt[] = {0, 2, 4, 1, 2};
for (int i = 0; i <= 2; i++)
for (int j = 0; j <= 4; j++)
for (int k = 0; k <= 1; k++)
for (int h = 0; h <= 2; h++)
{
int x = n - (i * 10 + j * 6 + k * 3 + h);
if (x >= 0 && x % 15 == 0)
res = min(res, i + j + k + h + x / 15);
}
cout << res << endl;
}
// void _()
// {
// int n;
// cin >> n;
// int res = 1e12;
// int a[] = {1, 3, 6, 10, 15}, vis[5] = {};
// vector<int> vec{15, 10, 6, 3, 1};
// int vnt = 0;
// auto get = [&]()
// {
// vnt++;
// int t = 0, tn = n;
// for (auto v : vec)
// {
// t += tn / v;
// tn %= v;
// }
// res = min(res, t);
// for (auto v : vec)
// cout << v << ' ';
// cout << endl;
// bug(t);
// };
// function<void(int)> dfs = [&](int k)
// {
// if (k == 5)
// {
// get();
// return;
// }
// for (int i = 0; i < 5; i++)
// if (!vis[i])
// {
// vis[i] = 1;
// vec[k] = a[i];
// dfs(k + 1);
// vis[i] = 0;
// }
// };
// dfs(0);
// cout << res << endl;
// // bug(vnt);
// }
A4.
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // 互動/除錯 關
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(6);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
void _()
{
int n, m;
cin >> n >> m;
vector<string> s(n + 2);
for (int i = 1; i <= n; i++)
{
cin >> s[i];
s[i] = " " + s[i] + " ";
}
vector<vector<int>> vis(n + 2, vector<int>(m + 2));
queue<pair<int, int>> q;
vis[0][0] = 1;
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
q.push({0, 0});
while (q.size())
{
auto [x, y] = q.front();
// bug2(x, y);
q.pop();
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i], ny = y + dy[i];
if (nx < 0 || nx > n + 1 || ny < 0 || ny > m + 1 || vis[nx][ny])
continue;
if (nx == 0 || nx == n + 1 || ny == 0 || ny == m + 1)
{
q.push({nx, ny});
// bug2(nx, ny);
vis[nx][ny] = 1;
}
else
{
if (i == 0)
{
if (s[x + 1][y] - 'U')
continue;
}
else if (i == 1)
{
if (s[x - 1][y] - 'D')
continue;
}
else if (i == 2)
{
if (s[x][y + 1] - 'L')
continue;
}
else if (s[x][y - 1] - 'R')
continue;
// bug(s[nx][ny]);
q.push({nx, ny});
vis[nx][ny] = 1;
}
}
}
int res = 0, cnt = 0;
function<void(int, int)> dfs = [&](int i, int j)
{
if (vis[i][j])
return;
vis[i][j] = 1;
cnt++;
for (int k = 0; k < 4; k++)
dfs(i + dx[k], j + dy[k]);
};
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (!vis[i][j])
{
cnt = 0;
// bug2(i, j);
dfs(i, j);
res += cnt == 1 ? 0 : cnt;
}
cout << res << endl;
}