yuwj  

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,今天还有体测

posted on 2025-05-10 14:34  xiaowang524  阅读(10)  评论(0)    收藏  举报