列表

详情


NC238802. 牛原子

描述

在题目描述中有形式化的题面,你可以选择跳过题目背景。同时请仔细将本题的除题目背景以外的所有内容进行完整阅读后再进行做题。

题目背景

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

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

同时,每一个电子亚层都有一定的容量,每一个电子亚层中填充的电子数不能超过其容量, 类电子亚层容量为  类电子亚层容量为  类电子亚层容量为  类电子亚层容量为 

例:第  个电子层的第  个电子亚层为 ,其容量为 ,第  个电子层的第  个电子亚层为 ,其容量为 

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

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

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

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

题目描述

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

电子亚层的命名格式为 xc,其中  为一个在  至  之间的正整数, 是一个字母,且只可能为  中的某一个。 类电子亚层容量为  类电子亚层容量为  类电子亚层容量为  类电子亚层容量为 

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

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

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

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

输入描述

每个测试点中包含 T 组测试数据。
输入共 行。
输入的一行为一个正整数 ,代表该测试点中测试数据的组数。
接下来 T 行,每行为一个正整数 ,代表该组测试数据询问的元素为第 n 号元素。

输出描述

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

示例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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 36ms, 内存消耗: 39568K, 提交时间: 2022-10-04 16:43:28

#include<bits/stdc++.h>
const int N=1e6+10;
using namespace std;
string s[]={"1s","2s","2p","3s","3p","4s","3d","4p","5s","4d","5p","6s","4f","5d","6p","7s","5f","6d","7p"};
int a[N];
struct edge
{
	string x;
	int w;
}b[N];
int main()
{
	a['s']=2;a['p']=6;a['d']=10;a['f']=14;
	int T;
	cin>>T;
	while(T--)
	{
		int n,len=0,i;
		cin>>n;
		int k=0;
		while(n)
		{
			int w=min(n,a[s[k][1]]);
			b[++len]={s[k],w};
			n-=w;
			k++;
		}
		sort(b+1,b+len+1,[](edge o,edge p){
			if(o.x[0]==p.x[0])	return a[o.x[1]]<a[p.x[1]];
			return o.x[0]<p.x[0];
		});
		for(i=1;i<=len;i++)
			cout<<b[i].x<<b[i].w<<" ";
		cout<<"\n";
	}
	
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 412K, 提交时间: 2022-11-17 10:43:44

#include<iostream>
#include<map>
using namespace std;

int a[20]={2,2,6,2,6,2,10,6,2,10,6,2,14,10,6,2,14,10,6};
string s[20]={"1s","2s","2p","3s","3p","4s","3d","4p","5s","4d","5p","6s","4f","5d","6p","7s","5f","6d","7p"};
string pos[20]={"1s","2s","2p","3s","3p","3d","4s","4p","4d","4f","5s","5p","5d","5f","6s","6p","6d","7s","7p"};

int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		map<string,int> mp;
		int k,i;
		cin>>k;
		for(int i=0;k!=0;i++)
		{
			if(k>=a[i]) mp[s[i]]=a[i],k-=a[i];
			else mp[s[i]]=k,k=0;
		}
		for(int i=0;i<=18;i++)
			if(mp[pos[i]]!=0) cout<<pos[i]<<mp[pos[i]]<<' ';
		cout<<endl;
	}
}

pypy3 解法, 执行用时: 75ms, 内存消耗: 23752K, 提交时间: 2022-10-02 19:23:34

dic={'s':2,'p':6,'d':10,'f':14}

#1s 2s 2p 3s 3p 4s 3d 4p 5s 4d 5p 6s 4f 5d 6p 7s 5f 6d 7p
s=['1s','2s','2p','3s','3p','4s','3d','4p','5s','4d','5p','6s','4f','5d','6p','7s','5f','6d','7p']
t=int(input())
for i in range(t):
    n=int(input())
    lis=[]
    for ss in s:
        if not n:
            break
        a=dic[ss[-1]]
        if a<=n:
            n-=a
            lis.append(ss+str(a))
        else:
            lis.append(ss+str(n))
            n=0
    lis.sort(key=lambda x:x[0])
    for a in lis:
        print(a,end=' ')
    print()
        
    
    

Python3 解法, 执行用时: 47ms, 内存消耗: 4488K, 提交时间: 2022-10-07 21:08:19

lis = ['1s','2s','2p','3s','3p','4s','3d','4p','5s','4d','5p','6s','4f','5d','6p','7s','5f','6d','7p']
dic = {'s':2,'p':6,'d':10,'f':14}
n=int(input())
for i in range(n):
    ele=int(input())
    ans=[]
    for a in lis:
        if ele-dic[a[1]]<=0:
            ans.append(a+str(ele))
            break
        ele-=dic[a[1]]
        ans.append(a+str(dic[a[1]]))
    ans.sort(key=lambda x:int(x[0])*1000+dic[x[1]])
    for j in ans:
        print(j,end=' ')
    print("")

上一题