原题:https://niumacode.com/training/112/problem/P1630

acm模式下处理形如: [[a1,b1],[a2,b2],...,[am,bm]]的以一行字符串输入的二维数组。

string line;
getline(cin, line);

// 处理输入字符串
line.erase(remove(line.begin(), line.end(), '['), line.end());
line.erase(remove(line.begin(), line.end(), ']'), line.end());

//以上remove(str.begin(),str.end(),'a')会把字符串str中的两个位置索引间所有的字符'a'都放到字符串末尾并返回字符串的新逻辑末尾,然后通过外层的erase把这个新逻辑末尾后的erase掉。
//通过以上方法,去除掉所有的'[',']'。剩下的line只剩下"1,2,3,4"这种/

stringstream ss(line);//转换为流
string token;//每次临时储存要存放的字符串(整数)

vector<vector<int>> cost(m,vector<int>(2));

//每次从整个字符串流ss中取遇到','之前的一段为token,再用stoi()把字符串转化为int型
for (int i = 0; i < m; i++) {
    getline(ss, token, ',');
    cost[i][0] = stoi(token);
    getline(ss, token, ',');
    cost[i][1] = stoi(token);
}

题解:

#include <iostream>
#include <vector>
#include<sstream>
#include <algorithm>
using namespace std;
int main() {
    int m;
    cin>>m;
    cin.ignore(); // 消耗换行符
    
    string line;
    getline(cin, line);
    
    // 处理输入字符串
    line.erase(remove(line.begin(), line.end(), '['), line.end());
    line.erase(remove(line.begin(), line.end(), ']'), line.end());
    
    stringstream ss(line);
    string token;
    
    vector<vector<int>> cost(m,vector<int>(2));
    
    for (int i = 0; i < m; i++) {
        getline(ss, token, ',');
        cost[i][0] = stoi(token);
        getline(ss, token, ',');
        cost[i][1] = stoi(token);
    }
    
    vector<int> diff;
    int precost=0;
    //假设全用a发,得到precost。然后再减去最大的m/2个(ai-bi) 或:加上最小的m/2个(bi-ai)的
    //由于sort是升序
    for(int i=0;i<m;i++){
        diff.push_back(cost[i][1]-cost[i][0]);
        precost+=cost[i][0];
    }
    sort(diff.begin(),diff.end());
    for(int i=0;i<m/2;i++){
        precost+=diff[i];
    }
    cout<<precost<<endl;
    return 0;

}
// 64 位输出请用 printf("%lld")