目录
HDU1029——Ignatius and the Princess IV
HDU1029——Ignatius and the Princess IV
题目描述
运行代码
#include<iostream>
#include<map>
#include<vector>
using namespace std;
int find(int n, vector<int>arr) {
map<int, int>count;
for (int num:arr) {
count[num]++;
}
int maxcount = 0;
int special = -1;
for (const auto& pair : count) {
if (pair.second >= (n + 1) / 2) {
special = pair.first;
break;
}
}
return special;
}
int main() {
int n;
while (cin >> n) {
vector<int>arr;
int num;
for (int i = 0; i < n; i++) {
cin >> num;
arr.push_back(num);
}
int res = find(n, arr);
cout << res << endl;
}
return 0;
}
代码思路
-
导入必要的头文件:代码开始时,导入了进行输入输出操作所需的
iostream
,用于跟踪每个数字频率的map
,以及用于动态数组的vector
。 -
定义
find
函数:这个函数接收一个整数n
,代表数组的大小,和一个整数向量arr
。在函数内部:- 声明了一个
count
映射来保存每个数字的频率。 - 遍历数组
arr
并递增映射中对应数字的计数器。 - 然后在映射中搜索任何其频率大于或等于
(n + 1) / 2
的数字。如果存在这样的数字,它将作为结果返回。条件(n + 1) / 2
确保当n
是奇数时,考虑确切的一半,而当n
是偶数时,向下取整给我们正确的阈值以确定主要元素。
- 声明了一个
-
定义
main
函数:这是程序开始执行的地方。在main
函数中:- 它从标准输入读取数组的大小
n
。 - 创建一个空的向量
arr
。 - 从标准输入读取
n
个数字并将它们添加到向量arr
中。 - 调用带有
n
和arr
作为参数的find
函数,并打印结果。
- 它从标准输入读取数组的大小
-
处理多个测试案例:围绕读取
n
的while
循环允许程序处理多个测试案例直到达到文件结尾(或者在读取时发生错误)。 -
从
main
返回:最后,main
函数返回0,表示程序成功终止。
HDU1030——Delta-wave
题目描述
运行代码
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int m, n;
while (cin >> m >> n) {
int a1 = static_cast<int>(sqrt(m - 1)) + 1; // 行坐标
int a2 = static_cast<int>(sqrt(n - 1)) + 1;
int b1 = (m - (a1 - 1) * (a1 - 1) + 1) / 2; // 斜左坐标
int b2 = (n - (a2 - 1) * (a2 - 1) + 1) / 2;
int c1 = (a1 * a1 - m + 2) / 2; // 右斜坐标
int c2 = (a2 * a2 - n + 2) / 2;
// 优化计算差异的部分
int rowDiff = abs(a1 - a2);
int leftDiagDiff =abs(b1 - b2);
int rightDiagDiff = abs(c1 - c2);
cout << rowDiff + leftDiagDiff + rightDiagDiff << endl;
}
return 0;
}
代码思路
-
读取输入:首先,代码读取两个整数
m
和n
,这可以被视为要定位的点。 -
计算行坐标:为了找到
m
和n
在行上的位置,分别计算了a1
和a2
。a1
和a2
分别表示m
和n
所在行的索引。这里使用了sqrt()
函数来估计最近的完全平方数的根,然后加1以确定行号。这是因为每一行都是由一个完全平方数开始的,如1, 4, 9, 16...等。 -
计算左斜线坐标:
b1
和b2
分别表示m
和n
在左斜线坐标系中的位置。计算方法是从m
和n
减去行开始的完全平方数,然后加上1,最后除以2。这是因为每行的左斜线坐标是线性递增的,而且行内第一个点的左斜线坐标为1。 -
计算右斜线坐标:
c1
和c2
分别表示m
和n
在右斜线坐标系中的位置。计算方法与左斜线坐标类似,但使用了不同的公式,考虑到右斜线坐标的特性。 -
计算差异:接下来,代码计算了三个方向上的差异:行、左斜线和右斜线。差异是通过计算绝对值来得到的,即
rowDiff
、leftDiagDiff
和rightDiagDiff
。 -
输出结果:最后,将这三个差异相加,并输出结果,这就是两个点在该特殊坐标系下的总距离。
HDU1031——Design T-Shirt
题目描述
运行代码
#include <iostream>
#include <vector>
#include <algorithm>
#include< functional >
using namespace std;
struct Element {
double total;
int ind;
};
bool compare(const Element& e1, const Element& e2) {
if (e1.total > e2.total) {
return true;
}
else if (e1.total == e2.total && e1.ind < e2.ind) {
return true;
}
return false;
}
int main() {
int n, m, k;
while (cin >> n >> m >> k) {
vector<vector<double>> factions(n, vector<double>(m));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> factions[i][j];
}
}
vector<Element> elements(m);
for (int j = 0; j < m; ++j) {
double total = 0;
for (int i = 0; i < n; ++i) {
total += factions[i][j];
}
elements[j] = { total, j + 1 };
}
sort(elements.begin(), elements.end(), compare);
vector<int> ans;
for (int i = 0; i < k; ++i) {
ans.push_back(elements[i].ind);
}
sort(ans.begin(), ans.end(), greater<int>());
for (int i = 0; i < k; ++i) {
cout << ans[i];
if (i < k - 1) {
cout << " ";
}
else {
cout << endl;
}
}
}
return 0;
}
代码思路
-
定义结构体
Element
:结构体包含两个成员变量,total
用于存储每个元素的总和,ind
用于存储元素的原始索引(实际使用时会加1以便于输出)。 -
比较函数
compare
:这是一个自定义的比较函数,用于对Element
结构体的实例进行排序。排序规则是先按total
降序排列,如果total
相同,则按ind
升序排列。 -
主函数
main
:- 首先读入三个整数
n
、m
和k
,分别代表矩阵的行数、列数和要选出的最大元素数量。 - 初始化一个
n
行m
列的二维向量factions
,用于存储输入的数据。 - 使用嵌套循环读取所有输入数据并填充
factions
。 - 创建一个
elements
向量,用于存储每一列的总和和对应的原始索引。 - 对
factions
中的每一列求和,并将结果存储在elements
向量的相应Element
结构体中。 - 使用
sort
函数和compare
比较函数对elements
向量进行排序,以找到总和最大的前k个元素。 - 创建一个
ans
向量,用于存储前k个元素的索引。 - 将前k个
Element
的ind
字段值存储到ans
中。 - 再次使用
sort
函数和greater<int>()
比较器对ans
进行降序排序,确保输出格式正确。 - 最后,遍历
ans
并输出前k个元素的索引,元素之间用空格分隔,最后一个元素后换行。
- 首先读入三个整数
整个程序的目标是处理一个n
行m
列的矩阵,计算每列的总和,然后找出总和最大的前k列并按照要求的格式输出这些列的索引。这种类型的代码常见于数据分析、统计排序等问题中,尤其是需要根据数据集中的数值进行排序和筛选的场景。