A. Alyona and a Square Jigsaw Puzzle
Alyona 拼装了一个不寻常的方形拼图。她按照以下方式在 𝑛 天内完成拼图:
第一天,她首先将中心块放在桌子中央。 第一天之后的每一天,她都会按顺时针方向在中心块周围放置一定数量的拼图,始终先完成每个方形层,然后再开始新的一层。 例如,她按以下顺序放置前 14 块拼图:
(颜色表示层数。第三层仍未完成。)
如果一天结束时拼图的组装部分没有任何已开始但未完成的层,Alyona 会很高兴。已知 Alyona 每天组装的零件数量,求出她感到快乐的天数。
输入
每个测试包含多个测试用例。第一行包含测试用例的数量 𝑡 ( 1≤𝑡≤500 )。测试用例的描述如下。
第一行包含一个整数 𝑛 ( 1≤𝑛≤100 ),表示天数。
第二行包含 𝑛 个整数 𝑎1,𝑎2,…,𝑎𝑛 ( 1≤𝑎𝑖≤100 , 𝑎1=1 ),其中 𝑎𝑖 是 Alyona 在第 𝑖 天组装的零件数量。
每个测试用例都保证在 𝑛 天结束时没有未完成的层。
输出
对于每个测试用例,打印一个整数:Alyona 快乐的天数。
//input
5
1
1
2
1 8
5
1 3 2 1 2
7
1 2 1 10 2 7 2
14
1 10 10 100 1 1 10 1 10 2 10 2 10 1
//output
1
2
2
2
3
注意
在第一个测试案例中,Alyona 只完成了一天中唯一的一层。
在第二个测试案例中,第一天,Alyona 完成了第一层,第二天,她完成了第二层。
在第三个测试案例中,她几天后完成了第二层。
在第四个测试案例中,她完成了第二层,并在同一天立即开始下一层,因此,她那天并不开心。她只在第一天和最后一天感到开心。
在第五个测试案例中,Alyona 在第一天、第四天和最后一天都很开心。
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
const int N = 110;
int f[N];
int main()
{
int t;
scanf("%d", &t);
set<int> myset;
for(int i = 0; i < 5000; i ++) myset.insert((2 * i + 1) * (2 * i + 1));
while(t--)
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; i ++) scanf("%d", &f[i]);
for(int i = 1; i < n; i++) f[i] += f[i - 1];
int ans = 0;
for(int i = 0; i < n; i ++)
{
if(myset.find(f[i]) != myset.end()) ans++;
}
printf("%d\n", ans);
}
return 0;
}
B. Replace Character
给定一个长度为 𝑛 的字符串 𝑠 ,仅由小写英文字母组成。
您必须执行以下操作一次:
选择任意两个索引 𝑖 和 𝑗 ( 1≤𝑖,𝑗≤𝑛 )。您可以选择 𝑖=𝑗 。 设置 𝑠𝑖:=𝑠𝑗 。 您需要最小化 𝑠 的不同排列数 † 。在执行一次操作后,输出具有最小不同排列数的任何字符串。
† 字符串的排列是将其字符排列成任意顺序。例如,“bac”是“abc”的排列,但“bcc”不是。
输入
每个测试包含多个测试用例。第一行包含测试用例的数量 𝑡 ( 1≤𝑡≤500 )。测试用例的描述如下。
每个测试用例的第一行包含 𝑛 ( 1≤𝑛≤10 )——字符串 𝑠 的长度。
每个测试用例的第二行包含 𝑠 ,长度为 𝑛 。字符串仅包含小写英文字母。
输出
对于每个测试用例,在应用一个操作后输出所需的 𝑠 。如果有多个解决方案,则打印其中任何一个。
//input
6
3
abc
4
xyyx
8
alphabet
1
k
10
aabbccddee
6
ttbddq
//output
cbc
yyyx
alphaaet
k
eabbccddee
tttddq
注意
在第一个测试用例中,我们可以在一次操作中获取以下字符串:“abc”、“bbc”、“cbc”、“aac”、“acc”、“aba”和“abb”。
字符串“abc”具有 6 个不同的排列:“abc”、“acb”、“bac”、“bca”、“cab”和“cba”。
字符串“cbc”具有 3 个不同的排列:“bcc”、“cbc”和“ccb”,这是所有可获取字符串中最低的。事实上,除“abc”之外的所有可获取字符串都有 3 个排列,因此其中任何一个都可以接受。
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
const int N = 12;
char s[N];
char s_[N];
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
map<char, int> mymap;
int n;
scanf("%d", &n);
char endline;
scanf("%c", &endline);
for(int i = 0; i < n; i++)
{
scanf("%c", &s[i]);
mymap[s[i]]++;
}
int max_n = 0, min_n = 12;
char max_c, min_c;
for(auto i = mymap.begin(); i != mymap.end(); i ++)
{
if(max_n < i -> second)
{
max_n = i -> second;
max_c = i -> first;
}
if(min_n >= i -> second)
{
min_n = i -> second;
min_c = i -> first;
}
}
for(int i = 0; i < n; i ++)
if(s[i] == min_c)
{
s[i] = max_c;
break;
}
for(int i = 0; i < n; i++) printf("%c", s[i]);
cout << endl;
}
return 0;
}