洛谷刷题 P1042 [NOIP2003 普及组] 乒乓球
题目传送:P1042 [NOIP2003 普及组] 乒乓球 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路
该题主要考察如何模拟这个输赢的过程,其实就是考察字符串数据读取和处理,以及各种情况的总和处理,也就是模拟
那么数据存储我们可以用C++的vector<char>,或者string,如果是C则需要用链表或者足够大的数组存储
对于比分数据,我们可以使用C++中的pair数据类型
vector<vector<char>> data; // 记录输入数据string input; // 一次读入一行while (cin >> input){vector<char> row(input.begin(), input.end()); //string转化为vector并存入data.push_back(row);if (find(input.begin(), input.end(), 'E') != input.end()) break; // 如果找到‘E’跳出循环}vector<pair<int, int>> z11; // 记录11制vector<pair<int, int>> z21; // 记录21制pair<int, int> z1(0, 0); // 记录11制一轮pair<int, int> z2(0, 0); // 记录21制一轮
接着我们对二维数据循环访问处理数据,对11制和21制一轮结束情况做讨论,注意if,else if的使用(是并行情况还是多选一情况)
for (int i = 0; i < data.size(); i++){for (int j = 0; j < data[i].size(); j++){if (data[i][j] == 'E') // 如果是E,存储剩余结果并结束{z11.push_back(z1);z21.push_back(z2);break;}else if (data[i][j] == 'W') // 如果是W,11制和21制0位都加1{z1.first += 1;z2.first += 1;}else if (data[i][j] == 'L') // 如果是L,11制和21制1位都加1{z1.second += 1;z2.second += 1;}if(((z1.first == 11 || z1.second == 11) && (abs(z1.first - z1.second) >=2)) || (z1.first > 11 || z1.second > 11) && (abs(z1.first - z1.second) >=2) ) // 如果分数等于11且超过2分或者分数大于11且超过2分 11制结束一轮,重置z1{z11.push_back(z1);z1.first = 0;z1.second = 0;}if(((z2.first == 21 || z2.second == 21) && (abs(z2.first - z2.second) >=2)) || (z2.first > 21 || z2.second > 21) && (abs(z2.first - z2.second) >=2) ) // 如果分数等于21且超过2分或者分数大于21且超过2分 21制结束一轮,重置z2{z21.push_back(z2);z2.first = 0;z2.second = 0;}}}
最后输出结果就行
AC代码
#include<iostream>
#include<utility>
#include<vector>
#include <algorithm>
using namespace std;int main()
{vector<vector<char>> data; // 记录输入数据string input; // 一次读入一行while (cin >> input){vector<char> row(input.begin(), input.end()); //string转化为vector并存入data.push_back(row);if (find(input.begin(), input.end(), 'E') != input.end()) break; // 如果找到‘E’跳出循环}vector<pair<int, int>> z11; // 记录11制vector<pair<int, int>> z21; // 记录21制pair<int, int> z1(0, 0); // 记录11制一轮, 0位表示华华赢pair<int, int> z2(0, 0); // 记录21制一轮for (int i = 0; i < data.size(); i++){for (int j = 0; j < data[i].size(); j++){if (data[i][j] == 'E') // 如果是E,存储剩余结果并结束{z11.push_back(z1);z21.push_back(z2);break;}else if (data[i][j] == 'W') // 如果是W,11制和21制0位都加1{z1.first += 1;z2.first += 1;}else if (data[i][j] == 'L') // 如果是L,11制和21制1位都加1{z1.second += 1;z2.second += 1;}if(((z1.first == 11 || z1.second == 11) && (abs(z1.first - z1.second) >=2)) || (z1.first > 11 || z1.second > 11) && (abs(z1.first - z1.second) >=2) ) // 如果分数等于11且超过2分或者分数大于11且超过2分 11制结束一轮,重置z1{z11.push_back(z1);z1.first = 0;z1.second = 0;}if(((z2.first == 21 || z2.second == 21) && (abs(z2.first - z2.second) >=2)) || (z2.first > 21 || z2.second > 21) && (abs(z2.first - z2.second) >=2) ) // 如果分数等于21且超过2分或者分数大于21且超过2分 21制结束一轮,重置z2{z21.push_back(z2);z2.first = 0;z2.second = 0;}}}for (int i = 0; i < z11.size(); i++){cout << z11[i].first << ":" << z11[i].second << endl;}cout << endl;for (int i = 0; i < z21.size(); i++){cout << z21[i].first << ":" << z21[i].second << endl;}return 0;
}