目录
[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;
}
谢礼
谢谢大家观看我的博客,祝大家学业有成