牛客小白月赛58 B - 牛原子 (模拟)

B-牛原子_牛客小白月赛58 (nowcoder.com)

题目背景

牛世界的原子由电子和牛子核组成,牛牛想要研究第 nnn 号元素的电子排布。

电子排布在电子层中,第 iii 个电子层有 iii 个电子亚层,在本题的数据范围内,你只需要考虑每个电子层最多前 444 个电子亚层,我们命名为 s,p,d,fs,p,d,fs,p,d,f 。每一个电子亚层用"电子层编号+电子亚层字母"来表示。

同时,每一个电子亚层都有一定的容量,每一个电子亚层中填充的电子数不能超过其容量,sss 类电子亚层容量为 222,ppp 类电子亚层容量为 666,ddd 类电子亚层容量为 101010,fff 类电子亚层容量为 141414。

例:第 333 个电子层的第 222 个电子亚层为 3p3p3p,其容量为 666,第 666 个电子层的第 444 个电子亚层为 6f6f6f,其容量为 141414。

电子的填充有一定的顺序,如果前一个电子亚层还没有填充满,则不能将电子填入当前电子亚层。在本题数据范围内,电子填充电子亚层的顺序如下。

1s 2s 2p 3s 3p 4s 3d 4p 5s 4d 5p 6s 4f 5d 6p 7s 5f 6d 7p

填充了电子的电子亚层我们以“电子亚层名称+电子数”的格式表示,例如 3p63p63p6 表示 3p3p3p 电子亚层填入了 666 个电子。

牛世界有自己的规则,因此牛世界原子的电子排布不必考虑洪特法则的特例,可参见输入输出样例第 444 组测试数据(对应元素为铜)。如果你不知道这句话的含义,可以忽略,这个不影响完成这道题目。

题目描述

你需要将 nnn 个电子填充在电子亚层中,每一个电子亚层有一定的容量,每一个电子亚层中填充的电子数不能超过其容量。

电子亚层的命名格式为 xc,其中 xxx 为一个在 111 至 777 之间的正整数,ccc 是一个字母,且只可能为 s,p,d,fs,p,d,fs,p,d,f 中的某一个。sss 类电子亚层容量为 222,ppp 类电子亚层容量为 666,ddd 类电子亚层容量为 101010,fff 类电子亚层容量为 141414。

电子的填充有一定的顺序,如果前一个电子亚层还没有填充满,则不能将电子填入当前电子亚层,电子填充电子亚层的顺序如下。

1s 2s 2p 3s 3p 4s 3d 4p 5s 4d 5p 6s 4f 5d 6p 7s 5f 6d 7p

填充了电子的电子亚层我们以 xcn 的格式表示,其中 xc 表示电子亚层名称,nnn 表示该电子亚层填入的电子个数。

你需要按照上面的格式输出这 nnn 个电子的排布,并要求优先输出电子层编号小的,电子层编号相同按照 s,p,d,fs,p,d,fs,p,d,f 的顺序输出。

输入描述:

每个测试点中包含 TTT 组测试数据。
输入共 T+1T + 1T+1 行。
输入的一行为一个正整数 T(1≤T≤200)T(1 \le T \le 200)T(1≤T≤200),代表该测试点中测试数据的组数。
接下来 TTT 行,每行为一个正整数 n(1≤n≤118)n(1 \le n \le 118)n(1≤n≤118),代表该组测试数据询问的元素为第 nnn 号元素。

输出描述:

输出共 TTT 行,每行输出所问元素的核外电子排布式。
要求优先输出电子层小的,电子层相同按照 spdfspdfspdf 的顺序输出。

示例1

输入

5
1
11
21
29
87

输出

1s1
1s2 2s2 2p6 3s1
1s2 2s2 2p6 3s2 3p6 3d1 4s2
1s2 2s2 2p6 3s2 3p6 3d9 4s2
1s2 2s2 2p6 3s2 3p6 3d10 4s2 4p6 4d10 4f14 5s2 5p6 5d10 6s2 6p6 7s1

代码:

#include
using namespace std;
#define endl "\n"
typedef pair PSI;
typedef long long ll;

int main() {
    ios::sync_with_stdio(false);
    cout.tie(0);

    vector a;  string s[30];
    a.push_back(2); s[0] = "1s";
    a.push_back(2); s[1] = "2s";
    a.push_back(6); s[2] = "2p";
    a.push_back(2); s[3] = "3s";
    a.push_back(6); s[4] = "3p";
    a.push_back(2); s[5] = "4s";
    a.push_back(10); s[6] = "3d";
    a.push_back(6);  s[7] = "4p";
    a.push_back(2);s[8] = "5s";
    a.push_back(10);s[9] = "4d";
    a.push_back(6);s[10] = "5p";
    a.push_back(2);s[11] = "6s";
    a.push_back(14);s[12] = "4f";
    a.push_back(10); s[13] = "5d";
    a.push_back(6);s[14] = "6p";
    a.push_back(2);s[15] = "7s";
    a.push_back(14);s[16] = "5f";
    a.push_back(10);s[17] = "6d";
    a.push_back(6);s[18] = "7p";

    int t;
    cin >> t;

    int n;
    while(t --) {
        vector ans[10];
        cin >> n;
        for(int i = 0; i <= 18; i ++) {
            if(n - a[i] > 0) {
                n -= a[i];
                ans[s[i][0] - '0'].push_back({s[i], a[i]});
            } 
            else {
                ans[s[i][0] - '0'].push_back({s[i], n});
                break;
            }
        }

        for(int i = 1; i <= 7; i ++) {
            for(int j = 0; j < ans[i].size(); j ++) {
                cout << ans[i][j].first << ans[i][j].second << " ";
            }
        }

        cout << endl;
    }

    return 0;
}

你可能感兴趣的:(算法笔记,算法,c++)