P8615拼接平方数 & P2708 硬币翻转 & P1808 单词分类 题解

目录

开幕雷击

P8615拼接平方数

题目描述

输入格式

输出格式

输入输出样例

说明/提示

题解

[P2708 硬币翻转](#P2708 硬币翻转)

题目描述

输入格式

输出格式

输入输出样例

说明/提示

样例解释

数据范围

题解

[P1808 单词分类](#P1808 单词分类)

题目描述

输入格式

输出格式

输入输出样例

说明/提示

题解

谢礼


开幕雷击

OK啊因为今天的题目比较的简单,所以直接3题练操了好吧,话不多说,请出第一题

P8615拼接平方数

题目描述

小明发现 4949 很有趣,首先,它是个平方数。它可以拆分为 44 和 99,拆分出来的部分也是平方数。169169 也有这个性质,我们权且称它们为:拼接平方数。

100100 可拆分 1,001,00,这有点勉强,我们规定,0,00,0000,00,000 等都不算平方数。

小明想:还有哪些数字是这样的呢?

你的任务出现了:找到某个区间的所有拼接平方数。

输入格式

两个正整数 𝑎,𝑏(𝑎<𝑏<1000000)a,b(a<b<1000000)。

输出格式

若干行,每行一个正整数。表示所有的区间 [𝑎,𝑏][a,b] 中的拼接平方数,从小到大输出。

输入输出样例

输入 #1复制

复制代码
169 10000

输出 #1复制

复制代码
169
361
1225
1444
1681
3249
4225
4900
9025

说明/提示

时限 1 秒, 256M。蓝桥杯 2014 年第五届国赛

题解

这题有经验的人一看就知道O(n)的最好算法就是打表了,先把1e6中的所有符合题目条件的数输出出来,然后放在一个数组里,输出出来就完事了

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int l,r,a[100] = {0, 49, 169, 361, 1225, 1444, 1681, 3249, 4225, 4900, 9025, 15625, 16900, 36100, 42025, 49729, 64009, 64009, 81225, 93025, 105625, 122500, 144400, 168100, 225625, 237169, 256036, 324900, 422500, 490000, 519841, 576081, 819025, 902500, 950625, 970225};
signed main() 
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> l >> r;
	for (int i = 1; i <= 100; i++) 
	{
		if (a[i] >= r)
		{
			break;
		}
		if (a[i] >= l)
		{
			cout << a[i] << endl;
		}
	}
	return 0;
}

P2708 硬币翻转

题目描述

有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用 11 表示,背面朝上的用 00 表示。

现在要求从这行的第一个硬币开始,将从第一个硬币开始的前若干个硬币同时翻面,求如果要将所有硬币翻到正面朝上,最少要进行这样的操作多少次?

输入格式

一个字符串,由 00 和 11 组成,表示硬币的初始状态。

输出格式

一个整数,表示要翻转的最少次数。

输入输出样例

输入 #1复制

复制代码
10

输出 #1复制

复制代码
2

说明/提示

样例解释

  • 第 1 次翻转:把第一个硬币翻到反面,字符串为 00;
  • 第 2 次翻转:把第一、二个硬币一起翻到正面,字符串为 11,翻转完成,输出 22。

数据范围

记 𝑛 表示硬币的总个数,

  • 对于 20% 的数据,1≤𝑛≤10;
  • 对于 50% 的数据,1≤𝑛≤104;
  • 对于 100% 的数据,1≤𝑛≤106。

题解

这题对于读入的长度为m的字符串,只需要从第二个开始判断,如果和前面的一样(s[ i ] == s[ i - 1])就删去,如:

0111000111 change to 0101

如果最后一个是1 答案就是删取后的字符串长度

如果最后一个是0 答案就加1 (相当于把全是背面朝上的变成全是正面朝上的)

cpp 复制代码
#include<bits/stdc++.h>
using namespace std; 
int i,m,k;
string s;
int main()
{
	ios::sync_with_stdio(false);
 	cin.tie(0);
 	cout.tie(0);
    cin>>s;
    m = s.size();
	k = m - 1;
    for(i = 1;i < m;i++)
	{
		if(s[i]==s[i-1])
		{
			k--;
		}    
		if(s[m-1]=='0')
		{
			k++;
		}
	}
    cout<<k;
    return 0;
}

P1808 单词分类

题目描述

Oliver 为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类。

两个单词可以分为一类当且仅当组成这两个单词的各个字母的数量均相等。

例如 AABACAABAC,它和 CBAAACBAAA 就可以归为一类,而和 AAABBAAABB 就不是一类。

现在Oliver有 𝑁N 个单词,所有单词均由大写字母组成,每个单词的长度不超过 100100。你要告诉 Oliver 这些单词会被分成几类。

输入格式

输入文件的第一行为单词个数 𝑁N,以下 𝑁N 行每行为一个单词。

输出格式

输出文件仅包含一个数,表示这 𝑁N 个单词分成的类数。

输入输出样例

输入 #1复制

复制代码
3 
AABAC 
CBAAA 
AAABB

输出 #1复制

复制代码
2

说明/提示

  • 对于 70% 的数据满足 1≤𝑁≤100;
  • 对于 100% 的数据满足 1≤𝑁≤10000。

题解

这题其实我们只需创建一个map,然后把输入的一串字母排好序然后判断在map中有没有过这行字符就行了,非常的简单

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,ans;
string s;
map<string,bool>b;
signed main() 
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i = 1;i <= n;i++)
	{
		cin>>s;
		sort(s.begin(),s.end());
		if(!b[s])
		{
			ans++;
			b[s] = 1;
		}
	}
	cout<<ans;
	return 0;
}

谢礼

谢谢大家观看我的博客,祝大家学业有成

相关推荐
single59438 分钟前
【c++笔试强训】(第四十五篇)
java·开发语言·数据结构·c++·算法
呆头鹅AI工作室2 小时前
基于特征工程(pca分析)、小波去噪以及数据增强,同时采用基于注意力机制的BiLSTM、随机森林、ARIMA模型进行序列数据预测
人工智能·深度学习·神经网络·算法·随机森林·回归
一勺汤2 小时前
YOLO11改进-注意力-引入自调制特征聚合模块SMFA
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·目标跟踪
每天写点bug2 小时前
【golang】map遍历注意事项
开发语言·算法·golang
程序员JerrySUN3 小时前
BitBake 执行流程深度解析:从理论到实践
linux·开发语言·嵌入式硬件·算法·架构
王老师青少年编程3 小时前
gesp(二级)(16)洛谷:B4037:[GESP202409 二级] 小杨的 N 字矩阵
数据结构·c++·算法·gesp·csp·信奥赛
robin_suli4 小时前
动态规划子序列问题系列一>等差序列划分II
算法·动态规划
cxylay4 小时前
自适应滤波算法分类及详细介绍
算法·分类·自适应滤波算法·自适应滤波·主动噪声控制·anc
茶猫_5 小时前
力扣面试题 - 40 迷路的机器人 C语言解法
c语言·数据结构·算法·leetcode·机器人·深度优先
轻浮j5 小时前
Sentinel底层原理以及使用算法
java·算法·sentinel