D
题意:

思路:
【经典边权01最短路】01bfs,deque代替了pq
详见:


代码:
/*
最短路,01bfs走迷宫代价
小变形:走的步长<=2,枚举就完了
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int n, m, dx[4] = {0,0,1,-1}, dy[4] = {1,-1,0,0};
int main()
{
cin >> n >> m;
vector<string> S(n);
vector<vector<int>> dis(n,vector<int>(m,-1));
for(int i = 0; i < n; i++) cin >> S[i];
int a, b, c, d; cin >> a >> b >> c >> d;
a--, b--, c--, d--;
deque<tuple<int,int,int>> q;
q.push_front({0,a,b});
while(!q.empty()){
auto [d, x, y] = q.front();
q.pop_front();
if(dis[x][y] != -1) continue;
dis[x][y] = d;
for(int k = 0; k < 4; k++)
for(int s = 1; s <= 2; s++)
{
int nx = x + dx[k]*s, ny = y + dy[k]*s;
if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if(s == 1 && S[nx][ny] == '.'){
q.push_front({d, nx,ny});
}else{
q.push_back({d+1, nx, ny});
}
}
}
cout << dis[c][d] << '\n';
return 0;
}
E
题意:

思路:
【分解质因子个数】
转化一下就是完全平方
注意ll i,开ll
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
typedef long long ll;
int ocnt[N];
int main()
{
for(int i = 2; i < N; i++){
if(ocnt[i] == 0){
for(int j = i; j < N; j+=i)ocnt[j]++;
}
}
vector<ll> vec;
for(ll i = 2; i < N; i++)
if(ocnt[i] == 2) vec.push_back(i*i);
int q; cin >> q;
while(q--)
{
ll x; cin >> x;
cout << *prev(upper_bound(vec.begin(), vec.end(), x)) << '\n';
}
return 0;
}
F
题意:
思路:
【环,破坏成链】【区间DP】
我就说这个题目怎么有点熟悉,原来是区间DP啊
看了题解才想到,还是练少了,但是atcoder的题目练到现在还真是好像都是挺典型的题目...至少没什么思维量,仿佛就是单个套路裸考了,dp也很典
f[l,r]:区间内涂好颜色的最小花费
转移也很好想:就是枚举划分点就完了,很典
这个问题的独特就是花费怎么维护?min(cost[l,r])怎么转移?
遇到相同颜色,就涂上一段连续相同颜色就好了
所以,代码就是题解里的那样了
#include <bits/stdc++.h>
#define rep(i, n) for (ll i = 0; i < (n); i++)
using namespace std;
using ll = long long;
const ll INF = 1000000000000000010;
template<class T, class U> inline bool chmin(T& a, const U& b) { if (a > b) { a = b; return true; } return false; }
int main() {
int n;
cin >> n;
vector<int> c(2 * n);
rep(i, n) {
cin >> c[i];
c[i]--;
c[n + i] = c[i];
}
vector<int> x(n);
rep(i, n) cin >> x[i];
vector dp(2 * n + 1, vector(2 * n + 1, INF)); // Cost to fill with color 0
vector ep(2 * n + 1, vector(2 * n + 1, INF)); // Cost to fill with color 0 or c[l]
rep(i, 2 * n + 1) { dp[i][i] = 0, ep[i][i] = 0; }
for (int l = 2 * n; l >= 0; l--) {
for (int r = l + 1; r <= 2 * n; r++) {
for (int m = l + 1; m < r; m++) {
chmin(dp[l][r], dp[l][m] + dp[m][r]);
chmin(ep[l][r], ep[l][m] + dp[m][r]);
}
if (c[l] == c[r - 1]) {
chmin(ep[l][r], ep[l][r - 1]);
chmin(dp[l][r], ep[l][r] + r - l + x[c[l]]);
}
}
}
ll ans = INF;
rep(i, n) chmin(ans, dp[i][n + i]);
cout << ans << '\n';
}
到这里已经不想动了QWQ,还有很多书没读,我好想放纵一下自己aaaaa,今天还有体测

浙公网安备 33010602011771号