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

洛谷刷题 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.kler.cn/news/334054.html

相关文章:

  • 大模型基础:基本概念、Prompt、RAG、Agent及多模态
  • Spring Boot 控制反转(IoC) 依赖注入(DI)
  • B树系列解析
  • 【数据结构】什么是红黑树(Red Black Tree)?
  • 关键字:volatile
  • 数据库概述(1)
  • easypoi, fastpoi快速导出xlsx,导出多sheet的xlsx
  • mysql-索引笔记
  • 有关自连接表的统一封装
  • 基于定制开发与2+1链动模式的商城小程序搭建策略
  • 招联2025校招内推倒计时
  • 如何在电脑上浏览手机界面
  • 【部署项目】禹神:前端项目部署上线笔记
  • 设计模式-模版方法模式
  • No.4 笔记 | 探索网络安全:揭开Web世界的隐秘防线
  • 如何在每台设备上恢复已删除的照片
  • 最新版的dubbo服务调用(用nacos做注册中心用)
  • 【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem:
  • rtmp协议转websocketflv的去队列积压
  • 【2024年最新】基于Spring Boot+vue的旅游管理系统lw+ppt