第1题-扑克牌-栈
#include<bits/stdc++.h>
#define Maxn 55using namespace std;void solve(){int n, m;cin>>n;vector<string> cards;for(int i = 0; i < n; i++){string str;cin>>str;cards.push_back(str);m = cards.size();while(m >= 3 && cards[m-1] == cards[m-2] && cards[m-1] == cards[m-3]){for(int j = 0; j < 3; j++) cards.pop_back();m = cards.size();}}m = cards.size();if(m == 0) {cout<<0; return ;}for(int i = 0; i < m; i++) cout<<cards[i]<<' ';
}int main(){solve();return 0;
}
第2题-云上服务-DFS
#include<bits/stdc++.h>
#define Maxn 1001using namespace std;map<string, vector<string>> edg;
map<string, int> sum_critical;
map<string, int> sum_normal;int dfs(string node){int sum = 5*sum_critical[node] + 2*sum_normal[node];for(string child : edg[node]){sum += dfs(child);}return sum;
}void solve(){int m, n, res;cin>>m>>n;for(int i = 0; i < n; i++){string edgs, edgt; int type, sum;cin>>edgt>>edgs>>type>>sum;if(type == 0) sum_critical[edgt] += sum;if(type == 1) sum_normal[edgt] += sum;if(find(edg[edgs].begin(), edg[edgs].end(), edgt) == edg[edgs].end())edg[edgs].push_back(edgt);}for(string root : edg["*"]){int Di = dfs(root);if(Di > m) res++;}cout<<res;
}int main(){solve();return 0;
}
第3题-服务逃生(隐藏)-最短路
#include<bits/stdc++.h>
#define Maxn 10000
#define INF 1e7using namespace std;int n;
int dist[Maxn+1], cap[Maxn+1];
int flag[Maxn+1], matrix[Maxn+1][Maxn+1];void dijstra(int fnode){for(int i = 0; i < n; i++) dist[i] = matrix[fnode][i];flag[fnode] = 1;dist[fnode] = 0; for(int i = 0; i < n-1; i++){int temp = -1;for(int j = 0; j < n; j++){if(!flag[j] && (temp == -1 || dist[j] < dist[temp])) temp = j;}flag[temp] = 1;for(int j = 0; j < n; j++) dist[j] = min(dist[j], dist[temp] + matrix[temp][j]);}dist[fnode] = INF;
}void solve(){cin>>n;for(int i = 0; i < n; i++)for(int j = 0; j < n; j++){cin>>matrix[i][j];if(matrix[i][j] == -1) matrix[i][j] = INF;if(i == j) matrix[i][j] = 0;}for(int i = 0; i < n; i++) cin>>cap[i];int fnode, M; cin>>fnode>>M; dijstra(fnode);array<int, 3> nodes[n];for(int i = 0; i < n; i++) nodes[i] = {dist[i], i, cap[i]};sort(nodes, nodes+n);int sum = 0, temp = 0;while(sum < M && temp < n-1){sum += nodes[temp][2];cout<<nodes[temp][1]<<' ';temp++;}
}int main(){solve();return 0;
}