• 【拼题A】 520 钻石争霸赛 2023 题解


    520-1 520无尽爱

    分数 5
    作者 陈越
    单位 浙江大学

    《I Love You 1000 Times》是 The Platters 于 2019 年演唱的歌曲。在 520 这个日子里,拼题 A 请你实现一个小功能,把 1000 这个数字换成用户输入的任意一个数字,然后仿照歌名的句式输出表白。当然,这里用中文 520 替换英文 I Love You。

    输入格式:
    输入在一行中给出一个不小于 100 且不超过 10 000 的正整数 N,是用户想要输出的一个数字。

    输出格式:
    在一行中按以下格式输出表白:

    520 N Times!
    
    • 1

    输入样例:

    6666
    
    • 1

    输出样例:

    520 6666 Times!
    
    • 1

    代码长度限制 16 KB
    时间限制 400 ms
    内存限制 64 MB

    输入输出

    #include 
    using namespace std;
    int main()
    {
    	int n;
    	cin>>n;
    	cout<<"520 "<<n<<" Times!";
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    520-2 心动指数

    分数 10
    作者 陈越
    单位 浙江大学

    一个人对另一个人的“心动指数”是一个 [−100,100] 区间内的整数,越大就表示越喜欢。当 A 对 B 的心动指数达到或超过了给定阈值 T 的时候,就称 A 对 B “动心”了。
    本题要求你根据你对某人的心动指数和 ta 对你的心动指数,判断你们两人之间的关系,而这个关系用一个表情符号来体现。规则如下:

    • 如果你对 ta 动心,且 ta 也对你动心,则输出 *^_^*
    • 如果你对 ta 动心,但 ta 没对你动心,则输出 T_T
    • 如果你没对 ta 动心,但 ta 对你动心,则输出 -_-#
    • 如果你没对 ta 动心,且 ta 也没对你动心,则输出 -_-

    输入格式:
    输入在一行中给出三个 [−100,100] 区间内的整数,依次为给定阈值 T、你对 ta 的心动指数、ta 对你的心动指数。

    输出格式:
    在一行输出对应的表情符号。

    输入样例:

    60 80 70
    
    • 1

    输出样例:

    *^_^*
    
    • 1

    代码长度限制 16 KB
    时间限制 400 ms
    内存限制 64 MB

    if else

    #include 
    using namespace std;
    int main()
    {
    	int t,a,b;
    	cin>>t>>a>>b;
    	if(a>=t&&b>=t)cout<<"*^_^*";
    	else if(a>=t)cout<<"T_T";
    	else if(b>=t)cout<<"-_-#";
    	else cout<<"-_-";
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    520-3 不要怕,爱!

    分数 10
    作者 陈越
    单位 浙江大学

    古代少女有了心上人时,会悄悄折一条树枝,揪那枝上的叶子,揪一片叶子念一句“爱我”,再揪一片念一句“不爱我”…… 这样揪落最后一片叶子的时候,看看是停在“爱”还是“不爱”。

    本题就请你根据枝条上叶子的片数,告诉你的用户应该从“爱”还是“不爱”开始,最后一定停在“爱”上。

    输入格式:
    输入在第一行中给出正整数 N(≤30),是来咨询的用户数。随后 N 行,每行给出一个不超过 100 的正整数,是用户手里枝条上叶子的片数。

    输出格式:
    对用户的每个询问,在一行中输出你的建议:如果建议从“爱”开始,就输出 Love!,否则输出 !Love

    输入样例:

    2
    18
    9
    
    • 1
    • 2
    • 3

    输出样例:

    !Love
    Love!
    
    • 1
    • 2

    代码长度限制 16 KB
    时间限制 400 ms
    内存限制 64 MB

    奇偶数判断

    #include 
    using namespace std;
    int main()
    {
    	int n;
    	cin>>n;
    	while(n--)
    	{
    		int x;
    		cin>>x;
    		if(x%2)
    		{
    			cout<<"Love!"<<endl;
    		}
    		else
    		{
    			cout<<"!Love"<<endl;
    		}
    	} 
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    520-4 天生一对

    分数 15
    作者 陈越
    单位 浙江大学

    网上查到 12 生肖婚姻最佳配对表如下:
      1、属鼠:与鼠宜配的生肖有龙、猴、牛;而生肖马、兔、羊则不宜与之合婚配对。
      2、属牛: 与牛宜配的生肖有鼠、蛇、鸡;而生肖羊、马、狗则不宜与之合婚配对。
      3、属虎: 与虎宜配的生肖有马、狗;而生肖猴、蛇则不宜与之合婚配对。
      4、属兔: 与兔宜配的生肖有羊、狗、猪;而生肖鸡、鼠则不宜与之合婚配对。
      5、属龙: 与龙宜配的生肖有鼠、猴、鸡;而生肖狗则不宜与之合婚配对。
      6、属蛇: 与蛇宜配的生肖有牛、鸡;而生肖猪、虎则不宜与之合婚配对。
      7、属马: 与马宜配的生肖有虎、羊、狗;而生肖鼠、牛则不宜与之合婚配对。
      8、属羊: 与羊宜配的生肖有兔、马、猪;而生肖牛、狗则不宜与之合婚配对。
      9、属猴: 与猴宜配的生肖有鼠、龙;而生肖虎、猪则不宜与之合婚配对。
      10、属鸡: 与鸡宜配的生肖有牛、龙、蛇;而生肖兔则不宜与之合婚配对。
      11、属狗: 与狗宜配的生肖虎、兔、猪;而生肖龙、牛则不宜与之合婚配对。
      12、属猪: 与猪宜配的生肖有兔、龙、猪;而生肖蛇、猴则不宜与之合婚配对。
    本题请你实现一个赛博算命先生,为前来咨询的恋人们判断一下,他们是否属相相合。

    注意:上面的宜配关系是不完全对称的,但是无妨,我们这里默认 A 与 B 宜配,则 B 一定与 A 宜配。

    输入格式:
    为方便起见,我们按 12 生肖的顺序(即:鼠牛虎兔龙蛇马羊猴鸡狗猪)将它们从 1 到 12 编号。输入首先给出每个生肖相合和不合的生肖对应关系。格式如下:

    生肖编号
    相合生肖数n 生肖1 ... 生肖n
    不合生肖数m 生肖1 ... 生肖m
    
    • 1
    • 2
    • 3

    题目保证给出的对应关系与题面中一致。
    随后一行中给出正整数 N(≤60),是来咨询的用户数。随后 N 行,每行给出一对恋人的属相。两个属相之间用空格分隔。

    输出格式:
    对用户的每个询问,在一行中输出你的建议:如果属相相合,就输出 Yes;如果属相不合,就输出 No;如果没有明确合还是不合,则输出 NA(Not Available 的意思)。

    输入样例:

    1
    3 5 9 2
    3 7 4 8
    2
    3 1 6 10
    3 8 7 11
    3
    2 7 11
    2 9 6
    4
    3 8 11 12
    2 10 1
    5
    3 1 9 10
    1 11
    6
    2 2 10
    2 12 3
    7
    3 3 8 11
    2 1 2
    8
    3 4 7 12
    2 2 11
    9
    2 1 5
    2 3 12
    10
    3 2 5 6
    1 4
    11
    3 3 4 12
    2 5 2
    12
    3 4 5 12
    2 6 9
    3
    8 4
    3 9
    2 5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    输出样例:

    Yes
    No
    NA
    
    • 1
    • 2
    • 3

    代码长度限制 16 KB
    时间限制 400 ms
    内存限制 64 MB

    set[]

    #include 
    using namespace std;
    set<int>h[13],b[13];
    int main()
    {
    	for(int i=1;i<=12;i++)
    	{
    		int x;
    		cin>>x;
    		int n;
    		cin>>n;
    		while(n--)
    		{
    			int y;
    			cin>>y;
    			h[x].insert(y);
    		}
    		cin>>n;
    		while(n--)
    		{
    			int y;
    			cin>>y;
    			b[x].insert(y);
    		}
    	}
    	int t;
    	cin>>t;
    	while(t--)
    	{
    		int x,y;
    		cin>>x>>y;
    		if(h[x].find(y)!=h[x].end()||h[y].find(x)!=h[y].end())cout<<"Yes"<<endl;
    		else if(b[x].find(y)!=b[x].end()||b[y].find(x)!=b[y].end())cout<<"No"<<endl;
    		else cout<<"NA"<<endl;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    520-5 翻倒数

    分数 15
    作者 陈越
    单位 浙江大学

    在这里插入图片描述

    我们看到,把数字 0-9 翻倒,有的数字就认不出来了,比如 2、3、4、5、7;有的数字看上去没什么大的变化,比如 0、1、8;还有的数字变成了另一个数,比如 6 变成 9,9 变成 6。

    给定一堆数字,请你判别每个数有没有可能是另一个数字翻倒形成的。

    输入格式:
    输入在第一行中给出一个正整数 n(≤20),随后 n 行,每行给出一个不超过 100 位的数字。

    输出格式:
    对每个给定的数字,如果它可能是由另一个数字翻倒得来的,就输出那个翻倒前的原始数字;如果不可能,就输出 bu ke neng。

    输入样例:

    4
    10086
    233
    9999
    17456
    
    • 1
    • 2
    • 3
    • 4
    • 5

    输出样例:

    10089
    bu ke neng
    6666
    bu ke neng
    
    • 1
    • 2
    • 3
    • 4

    代码长度限制 16 KB
    时间限制 400 ms
    内存限制 64 MB

    string

    #include 
    using namespace std;
    int main()
    {
    	int n;
    	cin>>n;
    	while(n--)
    	{
    		int f=1;
    		string s;
    		cin>>s;
    		for(int i=0;i<s.length();i++)
    		{
    			if(s[i]=='2'||s[i]=='3'||s[i]=='4'||s[i]=='5'||s[i]=='7')
    			{
    				f=0;
    				break;
    			}
    			if(s[i]=='6')s[i]='9';
    			else if(s[i]=='9')s[i]='6';
    		}
    		if(f==0)
    		{
    			cout<<"bu ke neng"<<endl;
    		}
    		else
    		{
    			cout<<s<<endl;
    		}
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    520-6 情侣数

    分数 20
    作者 陈越
    单位 浙江大学

    要凑出一个“情侣数”可不太容易。这个数字需要满足以下几个条件:

    • 情侣数必须是一个正整数,并且有偶数位;
    • 将这个数分为位数相同的前一半 A 和后一半 B,则 A 的各位数字从左到右是非递增的,B 的各位数字从左到右是非递减的;
    • 将 A 和 B 的各位数字分别加起来得到对应的 S A S_A SA S B S_B SB ,则 S A S_A SA S B S_B SB 的奇偶性是相反的。

    例如 98762234 就是一个情侣数,因为它是一个 8 位正整数;前一半 9876 的各位数字是严格递减的,后一半 2234 的各位数字是非递减的; S A S_A SA =9+8+7+6=30 是偶数, S B S_B SB =2+2+3+4=11 是奇数。
    本题就请你找出给定的一系列数字中最大的那个情侣数。

    输入格式:
    输入第一行首先给出一个正整数 N(≤ 1 0 4 10^4 104 ),随后 N 行,每行给出一个绝对值小于 1 0 8 10^8 108 的整数。

    输出格式:
    在第一行中输出 N 个给定数字中共有几个情侣数,第二行输出最大的那个情侣数。题目保证这个数字一定存在。

    输入样例:

    5
    -2157
    6621138
    99123199
    3112
    98762234
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出样例:

    2
    98762234
    
    • 1
    • 2

    样例说明:
    样例输入中前 3 个数字都不是情侣数。最后 2 个情侣数中,最后一个数字比较大,所以被输出。

    代码长度限制 16 KB
    时间限制 400 ms
    内存限制 64 MB

    string

    #include 
    using namespace std;
    int main()
    {
    	int n,ma=0,rr=0;
    	cin>>n;
    	while(n--)
    	{
    		string s;int f=1;
    		cin>>s;
    		if(s[0]=='-'||s.length()%2)f=0;
    		string l=s.substr(0,s.length()/2);
    		string r=s.substr(s.length()/2);
    		for(int i=1;i<l.length();i++)
    		{
    			if(l[i]>l[i-1])f=0;
    		}
    		for(int i=1;i<r.length();i++)
    		{
    			if(r[i]<r[i-1])f=0;
    		}
    		int sa=0;
    		for(int i=0;i<l.length();i++)
    		{
    			sa+=(l[i]-'0');
    		}
    		int sb=0;
    		for(int i=0;i<r.length();i++)
    		{
    			sb+=(r[i]-'0');
    		}
    		if((sa%2)^(sb%2)==0)f=0;
    		if(f==1)
    		{
    			rr++;
    			if(stoi(s)>ma)ma=stoi(s);
    		}
    	}
    	cout<<rr<<endl;
    	cout<<ma;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    520-7 撒狗粮

    分数 20
    作者 陈越
    单位 浙江大学

    在这里插入图片描述

    网络上称一对情侣秀恩爱为“撒狗粮”,因为单身人士统称为“单身狗”。
    在一个大型聚会上,所有宾客被安排坐在一张长条宴会桌边。如果一对情侣坐在一起,那么他们两人身边的单身狗就会被撒一脸狗粮;如果他们没有坐在一起,那么所有被夹在他们两人之间的单身狗都会被撒一脸狗粮。
    本题就请你找出被撒狗粮最多(以“脸”为单位)的那位单身人士。

    输入格式:
    输入第一行给出一个正整数 N(≤ 50 000),是已知情侣的对数;随后 N 行,每行给出一对情侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤ 80 000),为参加派对的总人数;随后一行按座位从左到右的顺序给出这 M 位客人的 ID,以空格分隔。题目保证无人脚踩两条船。

    输出格式:
    在一行中输出被撒狗粮最多的单身人士。如果不唯一,按 ID 递增顺序列出。ID 间用 1 个空格分隔,行的首尾不得有多余空格。
    题目保证至少有一个输出。

    输入样例:

    4
    11111 22222
    33333 44444
    55555 66666
    77777 88888
    10
    11111 33333 88888 22222 23333 55555 66666 10000 44444 12345
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出样例:

    10000 23333 88888
    
    • 1

    注意:88888 虽然有伴侣,但在聚会上是单身。

    代码长度限制 16 KB
    时间限制 400 ms
    内存限制 64 MB

    差分

    #include 
    using namespace std;
    map<int,int>m,m1,m2;
    // m , m1 , m2 
    int q[800010];
    int ma;
    vector<int>r;
    int main()
    {
    	int n;
    	cin>>n;
    	while(n--)
    	{
    		int x,y;
    		scanf("%d%d",&x,&y);
    		m[x]=y;
    		m[y]=x;
    	}
    	cin>>n;
    	vector<int>v;
    	for(int i=1;i<=n;i++)
    	{
    		int x;
    		scanf("%d",&x);
    		v.push_back(x); 
    		m2[x]=i-1;
    	}
    	map<int,int>f; // f <序号, 有没有计算过>
    	for(int i=0;i<n;i++)
    	{
    		if(f[i]==0)
    		{
    			int t=m2[m[v[i]]]; // 第i个人情侣的序号
    			if(t!=0) // 有情侣
    			{
    				if(t==i+1)
    				{
    					if(i!=0)
    					{
    						q[i-1]+=1;
    						q[i]-=1;
    					}
    					if(t!=n-1)
    					{
    						q[t+1]+=1;
    						q[t+2]-=1;
    					}
    				}
    				else
    				{
    					q[i+1]+=1;
    					q[t]-=1;
    				}
    				m1[v[i]]=1;
    				m1[m[v[i]]]=1;
    			}
    			f[m2[m[v[i]]]]=1;
    		}
    	}
    	int s=0,ff=0;
    	set<int>se;
    	for(int i=0;i<n;i++)
    	{
    		s+=q[i];
    		if(m1[v[i]]==0) // 单身或情侣没来
    		{
    			if(s>ma)
    			{
    				ma=s;
    				se.clear();
    				se.insert(v[i]);
    			}
    			else if(s==ma)
    			{
    				se.insert(v[i]);
    			}
    		}
    	}
    	for(auto i=se.begin();i!=se.end();i++)
    	{
    		if(ff==1)printf(" ");
    		printf("%05d",*i);
    		ff=1;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86

    520-8 相亲大会

    分数 25
    作者 陈越
    单位 浙江大学

    某婚恋网站组织了一场相亲大会。组织者手里有一份签到表,按座位号的顺序列出前来参会的客人。但客人们要根据这份表找到自己的座位编号就很麻烦了。本题就要求你编写程序,帮助来参会的客人们快速找到他们的座位号。

    输入格式:
    输入第一行给出一个不超过 1 0 3 10^3 103 的正整数 N,是相亲大会的注册人数。以下 N 行,第 i 行给出座位号为 i 的客人的注册号(i=1,⋯,N)。注册号是一个不超过8位、完全由数字组成的字符串。输入保证每位客人只分配一个座位。
    接下来一行给出一个不超过 1 0 5 10^5 105 的正整数 M,是待查询的客人数。以下 M 行,每行给出一个待查询的客人的注册号。

    输出格式:
    对每一位待查询的客人,如果他在会场里有座位,则在一行中输出其座位号;否则输出 Sorry,表示座位号不存在。

    输入样例:

    5
    100013
    200233
    100001
    520077
    886759
    4
    520077
    000000
    100013
    999999
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    输出样例:

    4
    Sorry
    1
    Sorry
    
    • 1
    • 2
    • 3
    • 4

    代码长度限制 16 KB
    时间限制 150 ms
    内存限制 64 MB

    map

    #include 
    using namespace std;
    map<string,int>m;
    int main()
    {
    	int n;
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	{
    		char ss[10];
    		scanf("%s",ss);
    		string s=ss;
    		m[s]=i;
    	}
    	int mm;
    	cin>>mm;
    	while(mm--)
    	{
    		char ss[10];
    		scanf("%s",ss);
    		string s=ss;
    		if(m[s]!=0)printf("%d\n",m[s]);
    		else printf("Sorry\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    Undefined和Null的区别
    【C++心愿便利店】No.8---C++之重识类和对象
    哈希表的查找与插入及删除
    web前端 html+css+javascript游戏网页设计实例 (网页制作课作业)
    InfluxDB1.8
    mongodb开启副本集功能
    Redis分布式锁——秒杀超卖
    单SoC芯片方案,或将加速行泊一体方案规模化量产应用
    技术中台的定义、范围与内容
    ImageKnife组件,让小白也能轻松搞定图片开发
  • 原文地址:https://blog.csdn.net/l503301397/article/details/130785136