C++输入输出的处理

发布于:2024-08-15 ⋅ 阅读:(122) ⋅ 点赞:(0)

ACM模式
A + B问题
输入描述:输入的第一行为一个整数N,接下来N行每行先输入一个整数M,然后在同一行内输入M个整数。
输出描述:对于每组输入,输出M个数的和,每组输出之间输出一个空行。

#include<iostream>
using namespace std;

int main (){
    int N;
    while (cin >> N) {
        while (N--) {
            int M, num;
            int sum = 0;
            cin >> M;
            while (M--){
                cin >> num;
                sum += num;
            }
           cout << sum << endl;
           if (N > 0) cout << endl;
        }
    }
    return 0;
}

字符串处理
从标准输入(stdin)读取一行文本(直到遇到换行符)并将其存储在字符串变量input中。std::getline()函数读取一行文本,而std::istringstream()将字符串转换为输入字符串流(istringstream),以便可以使用>>运算符从中读取整数。
一个简单的例子来说明:

#include <iostream>
#include <sstream>
using namespace std;

int main() {
    string input;
    getline(cin, input); // 从标准输入读取一行文本并将其存储在input中
    istringstream iss(input); // 将input转换为输入字符串流
    int num;
    iss >> num; // 从iss中读取一个整数并将其存储在num中
    cout << "Read integer: " << num << endl;
    return 0;
}


在这个例子中,程序首先从标准输入读取一行文本,然后将其转换为输入字符串流。接着,程序从输入字符串流中读取一个整数并将其存储在变量num中。最后,程序输出读取到的整数。

例题:输入物品件数M,背包容量为N,再输入物品价值,求可携带最大价值

#include <iostream>
#include <vector>
using namespace std;
int main() {
    int M, N;
    cin >> M >> N; // 01背包,动态规划
    vector<int> weight(M);
    vector<int> value(M);
    for (int i = 0; i < M; i++) {
        cin >> weight[i];
    }
    for (int i = 0; i < M; i++) {
        cin >> value[i];
    }
    vector<vector<int>> dp(M, vector<int>(N + 1, 0));
    for (int k = weight[0]; k <= N; k++) dp[0][k] = value[0]; // i从1开始
    for (int i = 1; i < M; i++) {
        for (int j = 0; j <= N; j++) {
            if (j < weight[i]) dp[i][j] = dp[i - 1][j];
            else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
        }
    }
    cout << dp[M - 1][N] << endl;
    return 0;
}


// 一维dp数组实现,滚动数组
#include <iostream>
#include <vector>
using namespace std;

int main() {
    // 读取 M 和 N
    int M, N;
    cin >> M >> N;

    vector<int> costs(M);
    vector<int> values(M);

    for (int i = 0; i < M; i++) {
        cin >> costs[i];
    }
    for (int j = 0; j < M; j++) {
        cin >> values[j];
    }

    // 创建一个动态规划数组dp,初始值为0
    vector<int> dp(N + 1, 0);

    // 外层循环遍历每个类型的研究材料
    for (int i = 0; i < M; ++i) {
        // 内层循环从 N 空间逐渐减少到当前研究材料所占空间
        for (int j = N; j >= costs[i]; --j) {
            // 考虑当前研究材料选择和不选择的情况,选择最大值
            dp[j] = max(dp[j], dp[j - costs[i]] + values[i]);
        }
    }

    // 输出dp[N],即在给定 N 行李空间可以携带的研究材料最大价值
    cout << dp[N] << endl;

    return 0;
}

网站公告

今日签到

点亮在社区的每一天
去签到