problemset.round990

40 阅读4分钟

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