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

算法题(108):

审题:

本题需要我们判断多组x,y的值的比赛结果

思路:

方法一:记忆化搜索

首先我们观察到以两个回合为一个轮回,x == (x+y)%p, y == (x+2*y)%p。

确认递归函数作用:返回dfs(x,y)的判断结果

不过本题有多组数据,所以我们必然会经历很多重复的计算,考虑使用记忆化搜索。

若我们直接用int型数组会导致空间占用过多,导致报错,所以我们使用char数组用字符的形

式记录结果。

平局分析:平局意味着计算出现中x,y完全重复的情况,任意只要出现过我们就可以记录为3,然后查备忘录的时候查到就说明出现过,可以直接返回了

解题:

#include<iostream>
using namespace std;
int t, p;
const int N = 1e4 + 10;
char f[N][N];//备忘录

(1)main函数

int main()
{
	cin >> t >> p;
	while (t--)//多组数据
	{
		int x, y;
		cin >> x >> y;
		char answer = dfs(x, y);
		if (answer == '1' || answer == '2')
		{
			cout << answer-'0' << endl;
		}
		else//平局
		{
			cout << "error" << endl;
		}
	}
	return 0;
}

(2)dfs

char dfs(int x, int y)
{
	if (f[x][y]) return f[x][y];//查找备忘录
	f[x][y] = '3';//标记已查询状态
	if (x == 0) return f[x][y] = '1';
	if (y == 0) return f[x][y] = '2';

	return f[x][y] = dfs((x+y)%p,(x+2*y)%p);
}

注意:

1.由于轮回中是先出现x,然后出现y,所以为了模拟轮次情况,先判断x再判断y。

2.每次判断结果都要记录在备忘录中,以进行剪枝

P5635 【CSGRound1】天下第一 - 洛谷

相关文章:

  • IM腾讯Trtc与vod云点播:实现合流录制并上传,根据参数返回视频地址
  • JSON简介及C++中的JSON使用指南
  • LangChain4j(1):初识LangChain4j
  • 【Linux】POSIX信号量与基于环形队列的生产消费者模型
  • ADS 学习和培训资源 - Keysight ADS
  • Netty——TCP 粘包/拆包问题
  • 信息系统运行管理员教程1--信息系统运维概述
  • 人员进出新视界:视觉分析算法的力量
  • MySQL入门级操作
  • Ubuntu服务器中Swapper如何与虚拟内存配合
  • 【八股】未知宽高元素水平垂直居中的三种方法
  • CNN基础考点
  • 【C++ Linux编程进阶 从0实现muduo库系列】第五讲:实现C++日志库
  • system V 消息队列信息量(了解)
  • 基于MoE架构的AIGC引擎:海螺AI重新定义人机协同新范式
  • 青柠视频云支持808协议和1078协议,支持SIP信令日志追踪
  • C++ queue容器总结
  • Android系统的安全问题 - Linux的能力模型(Capability)和 SELinux 的区别
  • MarkLogic索引详解
  • C++20 中的std::c8rtomb和 std::mbrtoc8
  • 国家统计局公布2024年城镇单位就业人员年平均工资情况
  • 英德宣布开发射程超2000公里导弹,以防务合作加强安全、促进经济
  • 混乱的5天:俄乌和谈如何从充满希望走向“卡壳”
  • 王伟妻子人民日报撰文:81192,一架永不停航的战机
  • 讲座预告|以危机为视角解读全球治理
  • 沪喀同心|为新疆青少年提供科普大餐,“小小博物家(喀什版)”启动