当前位置: 首页 > news >正文

洛谷刷题 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;
}

 


http://www.mrgr.cn/news/43400.html

相关文章:

  • Linux dlsym符号查找疑惑分析
  • SAP MM学习笔记 - 豆知识10 - OMSY 初期化会计期间,ABAP调用MMPV/MMRV来批量更新会计期间(TODO)
  • 懒洋洋浅谈--机器学习框架
  • 网络通信——OSPF和RIP的区别(总结)
  • 【漏洞复现】锐捷 RG-EW1200G 无线路由器 登录绕过
  • STL07——手写一个简单版本的unordered_set
  • Error while loading conda entry point: conda-libmamba-solver
  • C++ 语言特性29 - 协程介绍
  • 【Python】Dejavu:Python 音频指纹识别库详解
  • 【运动控制】关于GPIO的NPN型输入与NPN漏型输入
  • 算法工程师重生之第二十天(组合总和 组合总和II 分割回文串 )
  • 2024/10/5 数据结构打卡
  • 【MySQL】数据库基础
  • 几个卷积神经网络(CNN)可视化的网站
  • 快仓智能斩获过亿美元D轮融资,加速全球智能仓储与物流布局
  • 优化理论及应用精解【21】
  • 直立行走机器人技术概述
  • CSS选择器 快速入门
  • 分治算法(1)_颜色分类
  • c++----多态(初识)