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;
}

谢礼

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

相关推荐
TANGLONG22236 分钟前
【初阶数据结构和算法】leetcode刷题之设计循环队列
java·c语言·数据结构·c++·python·算法·leetcode
禁默1 小时前
路径规划算法之Dijkstra算法
算法
2401_878937711 小时前
数组和正则表达式
数据结构·算法
subject625Ruben1 小时前
亚太杯数学建模C题思路与算法(2024)
算法·数学建模
峰度偏偏1 小时前
【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配
算法·游戏·unity·ue5·ue4·godot
猫猫猫喵2 小时前
题目:素数列
算法
想成为高手4992 小时前
深入理解二叉搜索树(BST)
数据结构·c++·算法
是阿建吖!2 小时前
【优选算法】前缀和
算法
闻缺陷则喜何志丹3 小时前
【C++数论 因数分解】829. 连续整数求和|1694
c++·数学·算法·力扣··因数分解·组数