原题: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")
浙公网安备 33010602011771号