HDU1029——Ignatius and the Princess IV,HDU1030——Delta-wave,HDU1031——Design T-Shirt

目录

HDU1029——Ignatius and the Princess IV

题目描述

运行代码

代码思路

HDU1030——Delta-wave

题目描述

运行代码

代码思路

HDU1031——Design T-Shirt

题目描述

运行代码

代码思路

HDU1029——Ignatius and the Princess IV

题目描述

Problem - 1029

运行代码

#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;
}

代码思路

  1. 导入必要的头文件:代码开始时,导入了进行输入输出操作所需的iostream,用于跟踪每个数字频率的map,以及用于动态数组的vector

  2. 定义find函数:这个函数接收一个整数n,代表数组的大小,和一个整数向量arr。在函数内部:

    • 声明了一个count映射来保存每个数字的频率。
    • 遍历数组arr并递增映射中对应数字的计数器。
    • 然后在映射中搜索任何其频率大于或等于(n + 1) / 2的数字。如果存在这样的数字,它将作为结果返回。条件(n + 1) / 2确保当n是奇数时,考虑确切的一半,而当n是偶数时,向下取整给我们正确的阈值以确定主要元素。
  3. 定义main函数:这是程序开始执行的地方。在main函数中:

    • 它从标准输入读取数组的大小n
    • 创建一个空的向量arr
    • 从标准输入读取n个数字并将它们添加到向量arr中。
    • 调用带有narr作为参数的find函数,并打印结果。
  4. 处理多个测试案例:围绕读取nwhile循环允许程序处理多个测试案例直到达到文件结尾(或者在读取时发生错误)。

  5. main返回:最后,main函数返回0,表示程序成功终止。

HDU1030——Delta-wave

题目描述

Problem - 1030

运行代码

#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;
}

代码思路

  1. 读取输入:首先,代码读取两个整数mn,这可以被视为要定位的点。

  2. 计算行坐标:为了找到mn在行上的位置,分别计算了a1a2a1a2分别表示mn所在行的索引。这里使用了sqrt()函数来估计最近的完全平方数的根,然后加1以确定行号。这是因为每一行都是由一个完全平方数开始的,如1, 4, 9, 16...等。

  3. 计算左斜线坐标b1b2分别表示mn在左斜线坐标系中的位置。计算方法是从mn减去行开始的完全平方数,然后加上1,最后除以2。这是因为每行的左斜线坐标是线性递增的,而且行内第一个点的左斜线坐标为1。

  4. 计算右斜线坐标c1c2分别表示mn在右斜线坐标系中的位置。计算方法与左斜线坐标类似,但使用了不同的公式,考虑到右斜线坐标的特性。

  5. 计算差异:接下来,代码计算了三个方向上的差异:行、左斜线和右斜线。差异是通过计算绝对值来得到的,即rowDiffleftDiagDiffrightDiagDiff

  6. 输出结果:最后,将这三个差异相加,并输出结果,这就是两个点在该特殊坐标系下的总距离。

HDU1031——Design T-Shirt

题目描述

Problem - 1031

运行代码

#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;
}

代码思路

  1. 定义结构体Element:结构体包含两个成员变量,total用于存储每个元素的总和,ind用于存储元素的原始索引(实际使用时会加1以便于输出)。

  2. 比较函数compare:这是一个自定义的比较函数,用于对Element结构体的实例进行排序。排序规则是先按total降序排列,如果total相同,则按ind升序排列。

  3. 主函数main

    • 首先读入三个整数nmk,分别代表矩阵的行数、列数和要选出的最大元素数量。
    • 初始化一个nm列的二维向量factions,用于存储输入的数据。
    • 使用嵌套循环读取所有输入数据并填充factions
    • 创建一个elements向量,用于存储每一列的总和和对应的原始索引。
    • factions中的每一列求和,并将结果存储在elements向量的相应Element结构体中。
    • 使用sort函数和compare比较函数对elements向量进行排序,以找到总和最大的前k个元素。
    • 创建一个ans向量,用于存储前k个元素的索引。
    • 将前k个Elementind字段值存储到ans中。
    • 再次使用sort函数和greater<int>()比较器对ans进行降序排序,确保输出格式正确。
    • 最后,遍历ans并输出前k个元素的索引,元素之间用空格分隔,最后一个元素后换行。

整个程序的目标是处理一个nm列的矩阵,计算每列的总和,然后找出总和最大的前k列并按照要求的格式输出这些列的索引。这种类型的代码常见于数据分析、统计排序等问题中,尤其是需要根据数据集中的数值进行排序和筛选的场景。

  • 23
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱姌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值