湘大 XTU OJ:1406 String Game、1098 素数个数 题解(非常详细)

news2024/11/23 22:16:29

1406  String Game

一、链接

1406 String Game

二、题目

题目描述

Alice和Bob正在玩一个基于字符串的游戏,一开始,Alice和Bob分别拥有一个等长的字符串S1和S2,且这两个字符串只包含小写字母。 在每个回合中,Alice和Bob必须分别选择自己的字符串的某一个位置并把这个位置上的字母改变为其他小写字母。 经过P个回合后,他们的得分分别等于自己的字符串中出现最多的字母出现的次数。 最终得分高者获胜,如果两人得分相等,则为平局。 现在你知道了初始的两个字符串S1、S2和回合数P,如果两人都以最优策略游戏,请问最后谁能获胜或者结果是平局。

输入

第一行是一个数T(1≤T≤100000),表示样例的个数。 然后每个样例第一行两个数字,分别是字符串长度N和回合数P,(1≤N≤100,0≤P≤109)。 接下来两行是两个字符串S1,S2,分别是Alice和Bob的初始字符串。

输出

对于每个样例,输出一行。如果Alice能获胜,输出"Alice",如果结果是平局,输出"Draw",否则输出"Bob"。

样例输入

4
6 2
xxxttu
xxttuu
6 5
xxxttu
xxttuu
6 3
xtuxtu
xxttuu
4 0
alic
ebob

样例输出

Alice
Draw
Draw
Bob

提示

巨大的输入,请使用C风格的输入

作者

代卓岑

三、题意

输入两个长度相等的字符串,经过多次改变,把某一个字母变成另一个字母,把出现次数最多的字母出现的次数作为分数,输出分数高的人的名字,或者是平局

四、代码

c++代码

#include <iostream>
#include<cstring>
using namespace std;

char s1[101],s2[101];
int a[30]={0},b[30]={0},countalicemax=0,countbobmax=0,scorealice=0,scorebob=0,n,p;

int main()
{
	int k;
	scanf("%d", &k);
	while (k--)
	{
		scanf("%d%d", &n, &p);
		
		scanf("%s", s1);
		scanf("%s", s2);
		
		for(int i=0;i<n;i++)
		{
			a[s1[i] - 'a']++;
			if (a[s1[i] - 'a'] > countalicemax) 	countalicemax = a[s1[i] - 'a'];
			
			b[s2[i] - 'a']++;
			if (b[s2[i] - 'a'] > countbobmax) 	countbobmax = b[s2[i] - 'a'];
		}
		
		if (countalicemax == n) 
		{
			if (p == 1)	scorealice = n - 1;
			else	scorealice = n;
		}
		else if (p >= n - countalicemax) scorealice = n;
		else 	scorealice = p + countalicemax;
		
		if (countbobmax == n)
		{
			if (p == 1) scorebob = n - 1;
			else scorebob = n;
		}
		else if (p >= n - countbobmax) scorebob = n;
		else scorebob = p + countbobmax;
		
		if (scorealice > scorebob)	printf("Alice\n");
		else if (scorealice < scorebob) printf("Bob\n");
		else	printf("Draw\n");
		
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		countalicemax=0,countbobmax=0,scorealice=0,scorebob=0;
	}
	
	return 0;
}

五、总结

1.把数组变量重置的时候,需要用循环来进行重置,或者使用memset函数来进行重置

memset(a,0,sizeof(a));

这个函数在cstring头文件里面,第一个参数是数组名,第二个参数是修改后的值,第三个参数是修改个数

2. 首先找到每一个字符串出现次数最多的字母,记录这个字母出现的次数,并不断地维护这个出现次数最多的字母(会发生改变),直到遍历完所有元素,找到出现次数最多的字母和它出现的次数

for(int i=0;i<n;i++)
{
	a[s1[i] - 'a']++;
	if (a[s1[i] - 'a'] > countalicemax) 	countalicemax = a[s1[i] - 'a'];
			
	b[s2[i] - 'a']++;
	if (b[s2[i] - 'a'] > countbobmax) 	countbobmax = b[s2[i] - 'a'];
}

和这一道题有点相似:湘大 XTU OJ 1260 Completed String 题解(非常详细):建立数组下标和数组元素之间的映射关系 ~scanf

3.分类讨论:

(1)如果出现次数最多的字母出现的次数等于字符串的长度,如果回合数等于1,那么分数就等于字符串总长度减去1,其余的所有情况,分数都等于字符串总长度,比如说,xxxxxx,6个x,操作两个回合,按照最优策略,先选择一个x更换为除x之外的任意一个字母,假设是a,然后再把这个a换成x,所以字符串经过两个回合没有发生变化,操作三个回合,先把x换成a,再把a换成b,再把b换成x,字符串还是可以保持原来的6个x的状态

这里很容易想错,误以为和操作的回合数的奇偶性有关,其实是没有关系的,按照最优策略,只要操作的回合数大于1,就可以让字符串保持原来的状态

(2)总长度减去出现次数最多的字母的出现次数如果小于回合数,说明把不是出现次数最多的字母更改一次变成出现次数最多的字母之后,还需要进行几个回合的操作,比如说xxxttu,假设回合数是5,我们经过3次操作,可以把字符串变成6个x,这个时候还剩下2次操作机会,把x换成a,a再换成x,假设操作回合数是4,我们可以先把字符串变成xxxxxu,这个时候用掉了2个回合的操作机会,还可以操作两次,把u变成a,再把a变成x,也就是整个字符串变成6个x,所以这种情况下,分数等于字符串的总长度

(3)剩下的情况(字符串总长度-出现次数最多的字母出现的次数>=操作的回合数):把每一个不是出现次数最多的字母修改为出现次数最多的字母即可,比如说xxxttu,回合数等于2,把原来的字符串修改为xxxxxu即可,这种情况下,分数等于出现次数最多的字母的出现次数+回合数

4.按照1的描述重置所有变量,方便下一次比较

5.解题的关键是用具体的例子模拟整个过程,理顺整个过程,以及按照最优策略需要怎么更换字母,从特殊到一般的一个思考过程


 

 

 1098 素数个数

链接:1098 素数个数

题目:

Description

给定两个非负整数a,b,其中0<= a,b<=1,000,000请计算这两个数之间有多少个素数。

输入

第一行是一个整数K(1<=K<=1000),表示有多少个样例,每个样例占一行,是两个整数a和b,每个整数之间用一个空格隔开。

输出

每行输出一个样例的结果。

Sample Input

2
2 3
17 19

Sample Output

2
2

Source

ericxie

 代码:

#include<iostream>

using namespace std;

const int N=1e6+10;

int q[N];

bool isprime(int a)
{
	if(a<2)	return false;
	
	for(int i=2;i*i<=a;i++)
		if(a%i==0)	return false;
	
	return true;
}

void start()
{
	for(int i=2;i<=N;i++)
		if(isprime(i))	q[i]=1;
}

int main()
{
	int t;
	scanf("%d",&t);
	
	start();
	
	while(t--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		
		if(a>b)	swap(a,b);
		
		int cnt=0;
		for(int i=a;i<=b;i++)
			if(q[i]==1)	cnt++;
		
		printf("%d\n",cnt);
	}
	
	return 0;
}

总结:

1.这个题目可以说是打表做出来的,打表的意思是先把所有答案存储在一张表里面(数组),然后再从表格里面查询答案

2.判断是否是素数是一个算法模板

bool isprime(int a)
{
	if(a<2)	return false;
	
	for(int i=2;i*i<=a;i++)
		if(a%i==0)	return false;
	
	return true;
}

3.打表操作是把所有是素数的元素标记为1

void start()
{
	for(int i=2;i<=N;i++)
		if(isprime(i))	q[i]=1;
}

这里注意,把这个数组定义为了全局变量,也就是说,下标为0,1的元素初始化为0,表示不是素数,所以循环从2开始

4.在查询操作之前打表,也就是说只用进行一次打表过程,如果放到多样例的循环里面就会超时

5.两个数字没有保证按照大小顺序输入,所以需要自己保证左边的数字小于右边的数字

if(a>b)	swap(a,b);

6.定义局部变量并且初始化,这样就不需要每一次循环之后重置,非常方便(算是经验了哈哈)

 

 


 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/872088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue-Router】路由入门

路由&#xff08;Routing&#xff09;是指确定网站或应用程序中特定页面的方式。在Web开发中&#xff0c;路由用于根据URL的不同部分来确定应用程序中应该显示哪个内容。 构建前端项目 npm init vuelatest //或者 npm init vitelatest安装依赖和路由 npm install npm instal…

Python Opencv实践 - 图像旋转

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR)#图像旋转 #Opencv中的旋转&#xff0c;首先通过cv.getRotationMatrix2D获得旋转矩阵 #cv.getRotationMatrix2D(center,ang…

抖音小程序实现less语言编译样式

1.在抖音开发工具中搜索扩展less 2. 然后点击小齿轮选择扩展设置 3. 然后在扩展设置中选择在settings.json中编辑# 4. 在settings.json中加入以下这段代码即可 // Easy LESS配置"less.compile": {"compress": false,//是否压缩"sourceMap": fal…

腾讯云轻量应用服务器Typecho应用模板搭建博客流程

腾讯云百科分享使用腾讯云轻量应用服务器Typecho应用模板搭建博客流程&#xff0c;Typecho 是开源的博客建站平台&#xff0c;具有轻量、高效、稳定等特点&#xff0c;操作界面简洁友好。该镜像基于 CentOS 7.6 64 位操作系统&#xff0c;并已预置 Nginx、PHP、MariaDB 软件。您…

学点Selenium玩点新鲜~,让分布式测试有更多玩法

前 言 我们都知道 Selenium 是一款在 Web 应用测试领域使用的自动化测试工具&#xff0c;而 Selenium Grid 是 Selenium 中的一大组件&#xff0c;通过它能够实现分布式测试&#xff0c;能够帮助团队简单快速在不同的环境中测试他们的 Web 应用。 分布式执行测试其实并不是一…

Unity2D RPG开发笔记 P1 - Unity界面基础操作和知识

文章目录 工具选择简单快捷键Game 窗口分辨率检视器Transform 组件Sprite Renderer综合检视器 工具选择 按下 QWERTY 可以选择不同的工具进行 旋转、定位、缩放 简单快捷键 按下 Ctrl D 可以复制物体 Game 窗口分辨率 16:9 为最常见的分辨率 检视器 Transform 组件 物体在…

django-基本环境配置

文章目录 django 环境安装1. 安装环境1.1 安装 Python (配置虚拟环境)1.1.1 步骤 1.2 Conda配置环境参考 django 环境安装 1. 安装环境 1.1 安装 Python (配置虚拟环境) 由于国外源速度慢&#xff0c;可以pip添加清华源 pip config set global.index-url https://pypi.tuna.…

什么是CSS的box-sizing属性?它有哪些取值,各有什么不同?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS的box-sizing属性⭐ 取值⭐ 不同之处⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web…

python单元测试框架(测试固件、批量执行)

python测试框架 在Python语言中应用最广泛的单元测试框架是unittest和pytest,unittest属于标准库&#xff0c;只要安装了Python解释器后就可以直接导入使用了,pytest是第三方的库&#xff0c;需要单独的安装。 1.白盒测试原理 在软件架构的层面来说&#xff0c;测试最核心的…

【算法篇C++实现】常见排序算法

文章目录 &#x1f680;一、选择排序&#x1f680;二、冒泡排序&#x1f680;三、插入排序&#x1f680;四、希尔排序&#x1f680;五、堆排序&#x1f680;六、归并排序&#x1f680;七、快速排序⛳总结&#xff1a; &#x1f680;一、选择排序 算法精炼每趟从待排序的记录中…

MySql存储过程详解

文章目录 存储过程1 介绍 基本语法创建:调用查看删除演示: 变量相关系统变量演示: 用户自定义变量局部变量 if语法参数介绍casewhilerepeatloop游标条件处理程序存储函数 存储过程 1 介绍 存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合&#xff0c;调用存储过…

章节3:Burp Suite模块详解及Proxy模块

章节3&#xff1a;Burp Suite模块详解及Proxy模块 3.1 Burp Suite界面布局 参考手册目录全文 https://portswigger.net/burp/documentation/contents 界面总览 旧版对比 菜单栏-Burp 搜索内容配置库用户选项Infiltrator&#xff08;渗透器&#xff09;Clickbandit&#xff…

zerotier requesting configuration

Q:zerotir无法获取physical ip A:路由器管理页面开启ipv6

2.函数进阶

2.1函数提升 函数提升与变量提升比较类似&#xff0c;是指函数在声明之前即可被调用。 总结: 1.函数提升能够使函数的声明调用更灵活 2.函数表达式不存在提升的现象 3.函数提升出现在相同作用域当中 2.2函数参数 1.动态参数 arguments 是函数内部内置的伪数组变量&#xff…

Java多线程知识点,看这一篇就够了!(超详细)

目录 一、认识线程&#xff08;Thread&#xff09; 1、概念 2、第一个多线程程序 &#xff08;1&#xff09;观察线程 3、创建线程 二、Thread 类及常见方法 1、Thread 的常见构造方法 2、Thread 的几个常见属性 3、启动一个线程&#xff1a;start 4、终止一个线程 &…

【JavaEE进阶】SpringBoot 配置文件

文章目录 SpringBoot配置文件1. 配置文件的作用2. 配置文件的格式3. properties 配置文件说明3.1 properties 基本语法3.2 读取配置文件3.3 properties 优缺点分析 4. yml配置文件说明4.1 yml 基本语法4.2 yml 配置读取 5. properties和yml的对比 SpringBoot配置文件 1. 配置文…

C++笔记之Eigen库的使用

C笔记之Eigen库的使用 code review! 文章目录 C笔记之Eigen库的使用0.矩阵构造和矩阵初始化1.声明一个2\*3的float矩阵&#xff1a;Matrix<float, 2, 3> matrix_23;2.初始化Matrix<float, 2, 3> matrix_23;- 使用逗号初始化器&#xff1a;- 使用赋值运算符逐个赋…

JZ38 字符串的排列

题目地址&#xff1a;字符串的排列_牛客题霸_牛客网 题目回顾&#xff1a; 解题思路&#xff1a; 这里用到了全排列和剪枝。 首先我们来说全排列&#xff0c;设置一个vis数组来记录当期元素是否被使用过&#xff0c;然后dfs遍历整个数组&#xff0c;列出所有符合条件的路径就是…

【ts】【cocos creator】excel表格转JSON

需要将表格导出为text格式放到项目resources/text文件夹下 新建场景&#xff0c;挂载到Canvas上运行 表格文件格式&#xff1a; 保存格式选text tableToJson : import CryptoJS require(./FileSaver);const { ccclass, property } cc._decorator;ccclass export default c…

完结,从零开始学python(十八)想成为一名APP逆向工程师,需要掌握那些技术点?

作为从零学python的最后一篇文章&#xff0c;我们来简单的回顾一下内容 1.编程语法 语法编程并发编程 网络编程多线程/多进程/协程 数据库编程 MySQLRedisMongoDB 2.机器学习 3.全栈开发 4.数据分析 NumpypandasMatplotlibHadoopSpark 5.爬虫工程师养成 采集功底自动化…