#include <iostream> using namespace std; int main() { int n, num, a = 0, b = 0; cin >> n; while (n--) { cin >> num; if (num % 2 != 0) a++; //成年人 else b++; //未成年人 } printf("%d %.2f %d %.2f\n", a, 1.0 * a / (a + b), b, 1.0 * b / (a + b)); return 0; }
第二题
Problem Description
有一个大容器,现在向其中加入若干铅锤的木板,每个木板的顶端坐标记为 (i,yi)
Input
第一行输入 n ,表示有 n 个木板 (1<=n<1000),接下来是 n 个木板高度
Output
输出该容器最大能装多少体积的水(容器不允许倾斜)
Sample Input
8
1 8 6 4 5 3 7 2
Sample Output
35
解题思路
直接暴力破解,找最大值
参考源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include <cmath> #include <iostream> using namespace std; int main() { int n, v = 0, num[1001], maxv = 0; cin >> n; for (int i = 0; i < n; i++) cin >> num[i]; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { v = min(num[i], num[j]) * (j - i); //最大体积 maxv = max(maxv, v); } } cout << maxv << endl; return 0; }
第三题
解题思路
参考源码
1
第四题
Problem Description
有一群人,现在告诉你他们之间的朋友关系。若 A 与 B 是朋友,B 是 C 的朋友,则 A 与 C 也是朋友。朋友关系都是双向的,即 A 与 B 是朋友,B 与 A 也是朋友。那么 A、B、C 就在同一个 “朋友圈”
Input
首先输入 n,m 表示有 n 个人,m 对关系 (1<=n<2000),接下来有 m 行每一行表示一对关系
// 方法一:并查集 #include <iostream> using namespace std; int fa[2001]; int find(int x) { if (x == fa[x]) return x; else return find(fa[x]); } int main() { int n, m, a, b, ans = 0; for (int i = 0; i < n; i++) fa[i] = i; //初始化 cin >> n >> m; while (m--) { cin >> a >> b; int fa1 = find(a); int fa2 = find(b); if (fa1 != fa2) fa[fa1] = fa2; //合并 } for (int i = 0; i < n; i++) { if (i == fa[i]) ans++; //根节点 } cout << ans << endl; system("pause"); return 0; }
// 方法二:DFS #include <cstring> #include <iostream> using namespace std; int map[2001][2001]; bool vis[2001]; void DFS(int u, int n) { vis[u] = true; //标记为已访问 for (int i = 1; i <= n; i++) { //对每个顶点 if (!vis[i] && map[u][i]) { vis[i] = true; DFS(i, n); } } } int main() { int n, m, a, b, count = 0; memset(map, 0, sizeof(map)); memset(vis, false, sizeof(vis)); cin >> n >> m; while (m--) { cin >> a >> b; map[a][b] = map[b][a] = 1; } for (int i = 1; i <= n; i++) { if (!vis[i]) { //若未访问 DFS(i, n); count++; //联通分量个数 } } cout << count << endl; return 0; }