第一题:电报破解
其实就是字符串模拟,给一个字符串(含空格),以及反转的长度。最终将字符串破解。
#include <iostream> #include <vector> #include <stack> #include <string> #include <cstring> #include <queue> #include <cmath> #include <algorithm> #include <stdlib.h> #include <map> using namespace std; int main() { string str; int n; scanf("%d", &n); // 输入一行数据 getchar(); getline(cin, str); int length = str.size(); // 如果n>=length,直接输出 if(n >= length){ for(int i = length - 1; i >= 0; i--) printf("%c", str[i]); printf("\n"); } else{ // 之前的 int before = length / n; int i = 0; for(int i = 1; i <= before; i++){ for(int j = i * n - 1; j >= (i - 1) * n; j--) printf("%c", str[j]); } int after = length % n; if(after != 0){ for(int i = length - 1; i >= length - after; i--) printf("%c", str[i]); } printf("\n"); } return 0; }
第二题:村庄建桥
给n个村庄,m座桥,m座桥的建桥成本w,并给出成本限制k,判断能否建桥使得村庄互通。这个题理解了其实就很简单,就是一个判断图是否连通,简单DFS就完事儿了。
#include <iostream> #include <vector> #include <stack> #include <string> #include <cstring> #include <queue> #include <cmath> #include <algorithm> #include <stdlib.h> #include <map> using namespace std; #define MAXVEX 100 #define INFINITYNUM 65535 // 邻接矩阵 struct GraphAdiMatix{ int numVertexes; int numEdges; // 顶点表 int vexs[MAXVEX]; // 邻接矩阵 int arc[MAXVEX][MAXVEX]; }; void DFSMatix(GraphAdiMatix G, bool visit[], int i){ visit[i] = true; for(int j = 0; j < G.numVertexes; j++){ if(G.arc[i][j] != INFINITYNUM && !visit[j]){ DFSMatix(G, visit, j); } } } // (Depth First Search, DFS)深度优先遍历邻接矩阵(其实就像二叉树的前序遍历) int DFSTraveseMatix(GraphAdiMatix G){ int count = 0; bool visit[MAXVEX]; memset(visit, false, sizeof(visit)); for(int i = 0; i < G.numVertexes; i++){ if(!visit[i]){ DFSMatix(G, visit, i); // 如果是连通图那么只会一次 count++; } } return count; } int main(int argc, char* argv[]) { int T; scanf("%d", &T); while(T--){ GraphAdiMatix G; // 输入顶点数和边数 int n, m, k; scanf("%d %d %d", &n, &m, &k); G.numVertexes = n; G.numEdges = m; // 顶点初始化 for(int i = 0; i < G.numVertexes; i++){ G.vexs[i] = i; } // 邻接矩阵初始化 for(int i = 0; i < G.numVertexes; i++){ for(int j = 0; j < G.numVertexes; j++) G.arc[i][j] = INFINITYNUM; } while(m--){ int x, y, w; scanf("%d %d %d", &x, &y, &w); if(w <= k) G.arc[x - 1][y - 1] = G.arc[y - 1][x - 1] = w; } int count = DFSTraveseMatix(G); cout<<count<<endl; if(count == 1) printf("Yes\n"); else printf("No\n"); } return 0; }
全部评论
(2) 回帖