题目略难-_-
选填
十来个选择填空,算法、八股、行测类似的逻辑题均有
算法一
N个节点,每个节点有一个时间和一个分数,问在规定时间内最多能拿到多少分
使用pair数据结构存储节点时间和分数,最开始将各节点按得分效率排序了,然后贪心算法只能过75,后考虑背包问题
#include <iostream>
#include <vector>
using namespace std;
int main() {
// string T,S;
// cin>>T;
// cin>>S;
// string total_ts;
// cin>>total_ts;
string T = "9,10,12";
string S = "100,300,200";
string total_ts = "20";
vector<pair<int,int> > get_array;
int now_number = 0;
for(auto c:T){
if(c>='0'&&c<='9') now_number = now_number*10+c-'0';
else {
get_array.push_back(make_pair(now_number,0));
now_number = 0;
}
}
get_array.push_back(make_pair(now_number,0));
now_number = 0;
int index = 0;
for(auto c:S){
if(c>='0'&&c<='9') now_number = now_number*10+c-'0';
else {
get_array[index++].second = now_number;
now_number = 0;
}
}
get_array[index++].second = now_number;
int total_t = 0;
for(auto c:total_ts){
if(c>='0'&&c<='9') total_t = total_t*10+c-'0';
}
int n = get_array.size();
vector<vector<int>> dp(n + 1, vector<int>(total_t + 1, 0));
for (int i = 1; i <= n; ++i) {
for (int t = 1; t <= total_t; ++t) {
if (get_array[i - 1].first <= t) {
dp[i][t] = max(dp[i - 1][t], dp[i - 1][t - get_array[i - 1].first] + get_array[i - 1].second);
} else {
dp[i][t] = dp[i - 1][t];
}
}
}
int max_value=dp[n][total_t];
cout << max_value << endl;
system("pause");
return 0;
}
算法二
玩家有k点体力,在一个图中,每移动一格消耗一点体力,可以向四个方向移动,求玩家从坐标00走到坐标mn的最短路径走法,若无法走到输出0
最短路径则仅考虑向右向下的路径即可,但按此思路仅过25,原因未知
#include <bits/stdc++.h>
using namespace std;
int main() {
int k,m,n;
cin>>k>>m>>n;
if(m+n>k) return 0;
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
dp[0][0] = 1;
for (int i = 0; i <= m; ++i) {
for (int j = 0; j <= n; ++j) {
if (i > 0) {
dp[i][j] += dp[i - 1][j];
}
if (j > 0) {
dp[i][j] += dp[i][j - 1];
}
}
}
cout<<dp[m][n];
}
// 64 位输出请用 printf("%lld")
算法三
输入n个ip地址和编号,给出m个编号之间的联通关系,求两个ip地址之间需要多少次跳转才可以通信
难点在于数据的处理及保存为图的方式,初始化为01矩阵后求解两点之间的最短路径即可
#include <bits/stdc++.h>
using namespace std;
int judge_path(const vector<vector<int>>& array, int a, int b) {
int n = array.size();
vector<bool> visited(n, false);
queue<pair<int, int>> q;
q.push({a, 0});
visited[a] = true;
while (!q.empty()) {
int current = q.front().first;
int jumps = q.front().second;
q.pop();
if (current == b) {
return jumps;
}
for (int i = 0; i < n; ++i) {
if (array[current][i] == 1 && !visited[i]) {
q.push({i, jumps + 1});
visited[i] = true;
}
}
}
return -1;
}
int main() {
int n,m;
cin>>n>>m;
unordered_map<string,int> my_map;
for(int i = 0;i<n;i++){
string temp_s;
cin>>temp_s;
int temp_index;
cin>>temp_index;
my_map[temp_s] = temp_index;
}
vector<vector<int> > array(n+1,vector<int>(n+1));
for(int i =0;i<m;i++){
int num1,num2;
cin>>num1>>num2;
array[num1][num2] = 1;
array[num2][num1] = 1;
}
int judge_nums;
cin>>judge_nums;
for(int i =0;i<judge_nums;i++){
string s1,s2;
cin>>s1>>s2;
// cout<<s1<<s2<<endl;
cout<<judge_path(array,my_map[s1],my_map[s2])<<endl;
}
}
// 64 位输出请用 printf("%lld")
算法四
给定一个初始状态随机的汉诺塔,初始状态满足八个大小不同的圆盘按从小到大的规则摆放在ab两柱上,问最少经过多少次可以将所有圆盘按从小到大的顺序摆放在c柱上
todo