0327 网易笔试
4321
2022.03.27
2022.03.28
发布于 湖南

t1 bfs ac

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

int main()
{	
 	freopen("C:\\Users\\Ambition\\Desktop\\in1.txt","r",stdin);
	int a, b, x, y, ans = INT_MAX, step = 0;
	cin >> a >> b >> x >> y;
	vector<pii> attack = {{-x, 0}, {0, -x}, {-y, -y}};
	queue<pii> q;
	q.push({a, b});
	set<pii> vis;
	vis.insert({a,b});
	while(!q.empty()){
		step++;
		int qsize = q.size();
		//cout << qsize << endl;
		for(int i = 0; i < qsize; i++){
			auto cur = q.front();
			q.pop();
			if(cur.first <= 0 && cur.second <= 0){
				goto ok;
			}
			for(int i = 0; i < 3; i++){
				auto next = cur;
				next.first += attack[i].first;
				next.second += attack[i].second;
				if(!vis.count(next) ){
					q.push(next);
					vis.insert(next);
					if(next.first <= 0 && next.second <= 0){
						goto ok;
					}
				}
			}
		}
	}
	ok:
	cout << step << endl;
	return 0;
}

t2 dp 60%

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{	
	freopen("C:\\Users\\Ambition\\Desktop\\in2.txt","r",stdin);

	string s;
	while(cin >> s){
		cout << s << endl;
		int n = s.size();
		if(n <= 1) {
			cout << 0 << endl;
			continue;
		}
		//dp[i] 前i个字符可以获得最大分数 
		vector<int> dp(n, 0);
		dp[0] = 0;
		if(abs(s[0] - s[1]) <= 1){
			dp[1] = s[0] + s[1] - 'a' - 'a' + 2;
		} 
		for(int i = 1; i + 1 < n; i++){
			dp[i] = max(dp[i], dp[i-1]);
			if(abs(s[i] - s[i-1]) <= 1){
				int v = s[i] + s[i - 1] - 'a' - 'a' + 2;
				if(i-2>=0)
				dp[i] = max(dp[i], dp[i-2] + v);
			}
			if(abs(s[i] - s[i+1]) <= 1){
				int v = s[i] + s[i + 1] - 'a' - 'a' + 2;
				dp[i+1] = max(dp[i + 1], dp[i - 1] + v);
			} else {
				dp[i] = max(dp[i], dp[i-1]);
			}
		} 
		cout << dp[n-1] << endl;
	}
	return 0;
}

t3 构造 ac 奇数全部放叶子节点上 偶数放剩下的节点

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){	
	freopen("C:\\Users\\Ambition\\Desktop\\in1.txt","r",stdin);

	int n;
	cin >> n;
	for(int i = 1; i <= n; i++){
		if(i % 2 == 0) cout << i << " ";
	} 
	for(int i = 1; i <= n; i++){
		if(i % 2 == 1) cout << i << " ";
	} 
	return 0;
}

t4 dp ac

我完全没有考虑向左走,但是不知道为什么还是ac了。不知道有没有大佬可以解释一下

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;

void print(vector<vector<int>>& ma){
	for(auto & row : ma){
		for(auto &e : row){
			cout << e << "\t";
		}
		cout << "\n";
	}
}

int main() {	
	freopen("C:\\Users\\Ambition\\Desktop\\in4.txt","r",stdin);

	int n, m, ans = INT_MAX;
	cin >> n >> m;
	vector<vector<int>> ma(n, vector<int>(m, 0));
	for(auto & row : ma){
		for(auto &e : row){
			cin >> e;
		}
	}
	vector<vector<int>> dp(n, vector<int>(m, INF));
	dp[0][0] = 0;
	for(int i = 1; i < n; i++){
		dp[i][0] = dp[i-1][0] + 1;
		if(ma[i][0] != ma[i-1][0]){
			dp[i][0]++;
		}
	}
	for(int j = 1; j < m; j++){
		dp[0][j] = dp[0][j - 1] + 1;
		if(ma[0][j] != ma[0][j-1]){
			dp[0][j]++;
		}
	}
	//print(dp);
	for(int i = 1; i < n; i++){
		for(int j = 1; j < m; j++){
			if(ma[i][j] == ma[i-1][j]){
				dp[i][j] = min(dp[i][j], dp[i-1][j] + 1);
			} else {
				dp[i][j] = min(dp[i][j], dp[i-1][j] + 2);
			}
			if(ma[i][j] == ma[i][j - 1]){
				dp[i][j] = min(dp[i][j], dp[i][j - 1] + 1);
			} else {
				dp[i][j] = min(dp[i][j], dp[i][j - 1] + 2);
			}
		}
	}
	print(dp);
	cout << dp[n-1][m-1] << endl;
	return 0;
}
评论 (19)