从现在开始记录洛谷cpp刷题源码(2)——算法(模拟与高精度)

        2025开始准备蓝桥杯,很多刷题笔记直接写在了代码的注释里,但是一个一个文件保存在电脑里太麻烦了,所以将所有我自己已经编译通过的代码放在这个文档里,也当是对自己学习成果的一个记录。

       我的代码就是按照我自己的思路写的,非常简单也方便我自己理解。 如果能够帮助到和我一样没有什么天赋的朋友,当然是更加荣幸之至。

        这是算法章节第一个——模拟与高精度。

        主页有上一个章节题目的思路和源码。 从现在开始记录洛谷cpp刷题源码

模拟与高精度是什么?

        我在学习的时候参考了以下博客:算法学习-模拟与高精度-优快云博客

        同时用Deepseek总结了什么是模拟与高精度:

        模拟算法,可能就是说按照问题的步骤一步步来,不涉及什么特别的技巧,直接模拟现实过程。比如,用户举的例子是计算阶乘,或者解决约瑟夫环问题。那模拟算法的关键就是按照题目描述,一步一步地实现,不需要复杂的数学公式或者优化。不过这样可能会比较耗时,尤其是数据量大的时候。

        然后是高精度计算。这里可能指的是当数字超过普通数据类型(比如int或long long)的范围时,如何处理这些大数。例如,计算1000的阶乘,结果会非常大,普通的整数类型存不下,这时候需要用数组或者字符串来存储每一位数字,然后自己实现加减乘除的操作。比如,把数字倒序存储在数组里,每一位进行运算,处理进位问题。这样就能处理非常大的数字了。

        模拟算法是一种解题思路,而高精度计算是一种具体的技术手段,两者可以结合使用。例如,在解决大数阶乘问题时,既需要模拟计算阶乘的步骤,又需要使用高精度技术来处理大数。

第一题:乒乓球

思路:

        上面也已经学习了模拟算法是什么东西,所以就直接按照这道题给的情景来做就好了。

        分析一下题目:有两种记分制度,其分别记分规则以及胜利条件如下:

11分制:

if(score>=11&&abs(a-b)>=2)
//即分数大于等于11分并且两边分差大于等于2

21分制:

if(score>=21&&abs(a-b)>=2)

        所以题目的要求应该是分为两个步骤,分别判断一个由W、L、E组成的字符串在两种不同制度之下的比分。

代码:

#include<iostream>
#include<string>
#include<cmath>
using namespace std;
void score_11(string& record)
{
	//总比分
	int A = 0, B = 0;
	int a=0, b=0;
	for (int i = 0; i < record.size(); i++)
	{
		int c = record[i];
		if (c == 'W')
		{
			a += 1;
		}
		else if (c == 'L')
		{
			b += 1;
		}
		else if (c == 'E')
		{
			break;//如果c等于E直接跳出循环,E后面的所有都不计算
		}
		//来判断是否需要总比分变化
		if ((a >= 11 || b >= 11)&&abs(a-b)>=2)
		{
			if (a >b) A += 1;
			else if (b >a) B += 1;
			cout << a << ":" << b << endl;
			a = 0;
			b = 0;
		}
	}
	cout << a<< ":" << b << endl;
}
void score_21(string& record)
{
	//这两个不一样的只有判断结束的比分不同
	//总比分
	int A = 0, B = 0;
	int a = 0, b = 0;
	for (int i = 0; i < record.size(); i++)
	{
		int c = record[i];
		if (c == 'W')
		{
			a += 1;
		}
		else if (c == 'L')
		{
			b += 1;
		}
		else if (c == 'E')
		{
			break;//如果c等于E直接跳出循环,E后面的所有都不计算
		}
		//来判断是否需要总比分变化
		if ((a >= 21 || b >= 21) && abs(a - b) >= 2)
		{
			if (a >b) A += 1;
			else if (b >a) B += 1;
			cout << a << ":" << b << endl;
			a = 0;
			b = 0;
		}
	}
	cout << a << ":" << b << endl;
}

int main()
{
	//尝试读取多行数据
	string record;
	string line;

	// 逐行读取输入,直到遇到包含 'E' 的行
	while (getline(cin, line)) {
		record += line;
		if (line.find('E') != string::npos) {
			break;
		}
	}
	score_11(record);
	cout << endl;
	score_21(record);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值