首页 > 其他分享 >HDU1000,HDU1001,HDU1002,HDU1003,HDU1004

HDU1000,HDU1001,HDU1002,HDU1003,HDU1004

时间:2024-07-17 15:27:10浏览次数:17  
标签:currentSum 颜色 int 代码 HDU1001 HDU1000 HDU1003 数组 Problem

目录

HDU1000——A + B Problem

题目描述

运行代码

代码思路

HDU1001——Sum Problem

题目描述

运行代码

代码思路

HDU1002——A + B Problem II(高精度加法)

题目描述

运行代码

代码思路

高精度加法模板

HDU1003——Max Sum

题目描述

运行代码

代码思路

HDU1004——Let the Balloon Rise

题目描述

运行代码

代码思路

HDU1000——A + B Problem

题目描述

Problem - 1000

运行代码

#include <iostream>  
using namespace std;  
int main() {  
    int A, B;   
    while (cin >> A >> B) {    
        cout << A + B << endl;  
    }  
    return 0;  
}

代码思路

直接输出A+B的和

HDU1001——Sum Problem

题目描述

Problem - 1001

运行代码

#include<iostream>
using namespace std;
int main()
{
	long long n;
	while (cin>>n)
	{
		printf("%lld\n\n", n * (n + 1) / 2);
	}
	return 0;
}

代码思路

求和公式

HDU1002——A + B Problem II(高精度加法)

题目描述

Problem - 1002

运行代码

#include <iostream>
#include <string>
using namespace std;
int main() {
    int T;
    cin >> T;
    for (int I = 1; I <= T; I++) {
        string a, b;
        int x[1005] = { 0 };
        int y[1005] = { 0 };
        int sum[1010] = { 0 };
        cin >> a >> b;
        int p = a.size();
        int q = b.size();
        int u = 1;
        int v = 1;
        int w = 1;
        for (int i = p - 1; i >= 0; i--) {  // 将每个数字倒序输入整形数组
            x[u++] = a[i] - '0';  // 将字符变为数字
        }
        for (int i = q - 1; i >= 0; i--) {  // 将每个数字倒序输入整形数组
            y[v++] = b[i] - '0';  // 将字符变为数字
        }
        u = u - 1;  // 记录数字的位数
        v = v - 1;
        if (u >= v)  // 进行模拟加法
        {
            for (int i = 1; i <= u; i++) {
                int e = x[i] + y[i] + sum[w];
                if (e < 10)
                    sum[w++] = e;
                else {
                    sum[w] = e - 10;
                    w++;
                    sum[w] = sum[w] + 1;
                }
            }
        }
        else {
            for (int i = 1; i <= v; i++) {
                int e = x[i] + y[i] + sum[w];
                if (e < 10)
                    sum[w++] = e;
                else {
                    sum[w] = e - 10;
                    w++;
                    sum[w] = sum[w] + 1;
                }
            }
        }
        cout << "Case " << I << ":" << endl;  // 按要求进行格式化输出
        for (int i = u; i >= 1; i--) {
            cout << x[i];
        }
        cout << " + ";
        for (int i = v; i >= 1; i--) {
            cout << y[i];
        }
        cout << " = ";
        if (sum[w] != 0)
            cout << sum[w];
        for (int i = w - 1; i >= 1; i--) {
            cout << sum[i];
        }
        cout << endl;
        if (I != T)
            cout << endl;  // 依照题目要求,在两个输出行之间有个空行。
    }
    return 0;
}

代码思路

  1. 首先,读取测试用例的数量T

  2. 对于每个测试用例,读取两个字符串ab,代表要相加的两个大整数。

  3. 创建三个数组x[]y[]sum[]x[]y[]用于分别存储字符串ab中的数字,而sum[]用于存储加法的结果。

  4. 使用循环将字符串中的数字转换为整数,并反向存储在x[]y[]数组中。这是因为从最低位开始进行加法更容易。

  5. 初始化uv作为ab的长度减一,这是因为数组是从1开始索引的。

  6. 执行加法操作,根据两个数的长度选择较长的一个进行循环。在每次迭代中,将对应的位相加,同时加上来自更高位的进位(如果有的话),并将结果存储在sum[]数组中。

  7. 输出格式化后的结果。首先输出测试用例的编号,然后是原始的两个大整数(按照原始顺序输出),接着是等于号和加法的结果。

  8. 在不同的测试用例之间,输出一个空行以便区分。

高精度加法模板

//C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
if (A.size() < B.size()) return add(B, A);
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
return C;
}

HDU1003——Max Sum

题目描述

Problem - 1003

运行代码

#include <iostream>
using namespace std;
int main() {
    int T;
    cin >> T;
    for (int i = 1; i <= T; i++) {
        int n;
        cin >> n;
        int a[100005];
        for (int j = 0; j < n; j++) {
            cin >> a[j];
        }
        int maxSum = a[0];
        int currentSum = a[0];
        int start = 0;
        int end = 0;
        int tempStart = 0;
        for (int j = 1; j < n; j++) {
            if (currentSum + a[j] < a[j]) {
                currentSum = a[j];
                tempStart = j;
            }
            else {
                currentSum += a[j];
            }
            if (currentSum > maxSum) {
                maxSum = currentSum;
                start = tempStart;
                end = j;
            }
        }
        cout << "Case " << i << ":" << endl;
        cout << maxSum << " " << start + 1 << " " << end + 1 << endl;
        if (i != T) {
            cout << endl;
        }
    }
    return 0;
}

代码思路

  1. 读取测试用例数量:首先,从标准输入读取一个整数 T,表示有多少组测试数据。

  2. 处理每组测试数据

    • 对于每一个测试案例,首先读入一个整数 n,代表数组的长度。
    • 然后,读入一个长度为 n 的整数数组 a
  3. 计算最大子数组和及其位置

    • 初始化 maxSum 为数组的第一个元素,currentSum 同样初始化为第一个元素。
    • 初始化 start 和 end 分别为0和0,它们将用于存储最大子数组的开始和结束位置。
    • 初始化 tempStart 为0,它将用于临时保存可能的新子数组的开始位置。
    • 使用一个循环遍历数组的其余部分(从第二个元素开始):
      • 如果当前元素与前缀和之和小于当前元素本身,则重置 currentSum 为当前元素,并更新 tempStart 为当前索引。
      • 否则,将当前元素加入到 currentSum 中。
      • 如果 currentSum 大于 maxSum,则更新 maxSum 为 currentSum,并更新 start 和 end 为 tempStart 和当前索引。
  4. 输出结果

    • 对于每个测试案例,输出 "Case i:",其中 i 是案例的编号。
    • 然后输出最大子数组的和、起始位置和结束位置。注意,这里的位置是基于1的索引,所以需要加1。
    • 如果这不是最后一个测试案例,输出一个空行以分隔不同的案例结果。
  5. 返回0:最后,函数返回0,表示程序正常结束。

HDU1004——Let the Balloon Rise

题目描述

Problem - 1004

运行代码

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main() {
    int N;
    while (cin >> N && N != 0) { // Read until N == 0
        map<string, int> colorCounts;
        for (int i = 0; i < N; ++i) {
            string color;
            cin >> color;
            colorCounts[color]++;
        }

        int maxCount = 0;
        string mostPopularColor;
        for (auto& entry : colorCounts) {
            if (entry.second > maxCount) {
                maxCount = entry.second;
                mostPopularColor = entry.first;
            }
        }

        cout << mostPopularColor << endl;
    }
    return 0;
}

代码思路

  1. 初始化变量

    • N:用于存储将要读取的颜色数量。
    • colorCounts:是一个std::map<std::string, int>类型,用来存储每种颜色及其出现的次数。键是颜色名称(字符串),值是颜色出现的次数(整数)。
  2. 读取颜色数据

    • 使用while循环读取颜色数量N,直到N等于0为止,这通常作为文件或输入流结束的标志。
    • 对于每一轮循环(即对于每组颜色数据),使用for循环读取N个颜色字符串,并将其添加到colorCounts映射中。如果颜色已经在映射中,那么其计数值会增加;如果颜色不在映射中,它会被添加到映射中,计数值初始化为1。
  3. 查找最流行的颜色

    • 使用范围基的for循环遍历colorCounts映射的每个条目。
    • 在循环中,比较当前颜色的计数值与已记录的最大计数值maxCount。如果当前颜色的计数值大于maxCount,则更新maxCount为当前颜色的计数值,并将mostPopularColor设置为当前颜色的名称。
  4. 输出结果:循环结束后,mostPopularColor将包含出现次数最多的颜色。将该颜色的名称输出到标准输出流(屏幕)。

  5. 循环和退出条件:由于使用了while循环,程序会持续读取和处理颜色数据,直到遇到N等于0的情况,此时循环结束,程序随之结束。

标签:currentSum,颜色,int,代码,HDU1001,HDU1000,HDU1003,数组,Problem
From: https://blog.csdn.net/u014114223/article/details/140464015

相关文章

  • hdu1003 Max Sum--DP
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1003​​一:原题内容ProblemDescriptionGivenasequencea[1],a[2],a[3]......a[n],yourjobistocalc......