招商银行研发岗 第一次笔试


第一题就是RL的问题,这题仔细想想应该算是个思维题吧。
这是第一题的AC代码,只要判断RL不同的时候两边的数量就可以啦。
#include <bits/stdc++.h>
using namespace std;
string s;
int an[100005]={0};
int main(){
	cin >> s;
	int cnt = 0;
	for(int i = 0; i < s.length(); i++){
		if(s[i] == 'R')
			cnt++;
		else{
			int cnt1 = 0;
			int x = i;
			while(i < s.length()&&s[i] == 'L'){
				cnt1++;
				i++;
			}
			i--;
			an[x-1] = max((cnt+1)/2 + cnt1/2, an[i-1]);
			an[x] = max(cnt/2 + (cnt1+1)/2, an[i]);
			cnt = 0;
		}
	}
	for(int i = 0; i < s.length(); i++){
		printf("%d%c", an[i], i == s.length()-1 ? '\n':' ');
	}
	return 0;
}


第二题就是个树形dp的板子题,仔细想一下就能想到,每次返回当前节点的最大路径。
AC代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n, x, y, z;
vector<pair<ll,ll> > v[500005];
ll val[500005], vis[500005];

ll dfs(ll x){
	ll sum = 0;
	vis[x] = 1;
	for(int i = 0; i < v[x].size(); i++){
		if(vis[v[x][i].first]) continue;
		sum = max(sum, dfs(v[x][i].first)+v[x][i].second);
	}
	val[x] = sum;
	return sum;
}
int main(){
	cin >> n;
	for(int i = 0; i < n-1; i++){
		cin >> x >> y >> z;
		v[x].push_back(make_pair(y, z));
		v[y].push_back(make_pair(x, z));
	}
	dfs(1);
	for(int i = 1; i <= n; i++){
		printf("%lld%c", val[i], i == n?'\n':' ');
	}
	return 0;
}

第三题,不会做,当时刚好也有事,,,感觉可以用dp写。。




#招商银行##笔试题目##秋招##校招#
全部评论

相关推荐

浪潮 通信信息 20k
点赞 评论 收藏
转发
点赞 9 评论
分享
牛客网
牛客企业服务