题目难度:
签到题:12385
幌子题:4
要求偏多,
算法题:7
520-1 520无尽爱
《I Love You 1000 Times》是 The Platters 于 2019 年演唱的歌曲。在 520 这个日子里,拼题 A 请你实现一个小功能,把 1000 这个数字换成用户输入的任意一个数字,然后仿照歌名的句式输出表白。当然,这里用中文 520 替换英文 I Love You。
输入格式:
输入在一行中给出一个不小于 100 且不超过 10 000 的正整数 N,是用户想要输出的一个数字。
输出格式:
在一行中按以下格式输出表白:
520 N Times!
输入样例:
6666
输出样例:
520 6666 Times!
题解:
签到题
#include <iostream>
using namespace std;
int main(void){
int n;cin>>n;
cout<<"520 "<<n<<" Times!";
return 0;
}
520-2 心动指数
一个人对另一个人的“心动指数”是一个 [−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
输出样例:
*^_^*
题解:
签到题2
判断是否大于等于阈值即可
#include <iostream>
using namespace std;
bool check(int a,int t){
return a>=t;
}
int main(void){
int a,b,t;cin>>t>>a>>b;
if(check(a,t)&&check(b,t))cout<<"*^_^*";
if(check(a,t)&&!check(b,t))cout<<"T_T";
if(!check(a,t)&&check(b,t))cout<<"-_-#";
if(!check(a,t)&&!check(b,t))cout<<"-_-";
return 0;
}
520-3 不要怕,爱!
古代少女有了心上人时,会悄悄折一条树枝,揪那枝上的叶子,揪一片叶子念一句“爱我”,再揪一片念一句“不爱我”…… 这样揪落最后一片叶子的时候,看看是停在“爱”还是“不爱”。
本题就请你根据枝条上叶子的片数,告诉你的用户应该从“爱”还是“不爱”开始,最后一定停在“爱”上。
输入格式:
输入在第一行中给出正整数 N(≤30),是来咨询的用户数。随后 N 行,每行给出一个不超过 100 的正整数,是用户手里枝条上叶子的片数。
输出格式:
对用户的每个询问,在一行中输出你的建议:如果建议从“爱”开始,就输出 Love!,否则输出 !Love。
输入样例:
2
18
9
输出样例:
!Love
Love!
题解:
签到题梅开三度
一片叶子一片叶子,最后其实就是奇偶问题。
判断该数是奇数还是偶数后打印相应的即可
#include <iostream>
using namespace std;
int main(void){
int n;cin>>n;
for(int i=0;i<n;i++){
int num;cin>>num;
if(num&1)cout<<"Love!\n";
else cout<<"!Love\n";
}
return 0;
}
520-4 天生一对
网上查到 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
题目保证给出的对应关系与题面中一致。
随后一行中给出正整数 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
输出样例:
Yes
No
NA
题解前传:
这道题上面一堆描述其实都是幌子,老幌子题了!
题解:
用一个三维数组存该生肖对其他生肖是合还是不合即可。因为数据范围较小,直接开记录布尔值(1表示有,0表示无)即可。
坑点1:给出的生肖编号不一定按顺序!
坑点2:宜配关系是不完全对称的,判断的时候不需要都相配才是对的
#include <iostream>
using namespace std;
int a[13][2][13]={0};
int main(void){
for(int i=1;i<=12;i++){
int num;
int k;cin>>k;//坑点1
cin>>num;
for(int j=0;j<num;j++){
int x;cin>>x;
a[k][0][x]=1;//相合生肖
}
cin>>num;
for(int j=0;j<num;j++)
{
int x;cin>>x;
a[k][1][x]=1;//不合生肖
}
}
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x,y;
cin>>x>>y;
if(a[x][0][y]||a[y][0][x]){
printf("Yes\n");
continue;
}
if(a[x][1][y]||a[y][1][x]){
printf("No\n");
continue;
}
cout<<"NA\n";
}
return 0;
}
520-5 翻倒数
我们看到,把数字 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
输出样例:
10089
bu ke neng
6666
bu ke neng
题解:
如果有翻倒数字就认不出来了的情况,就可以直接判
bu ke neng
如果没有上述情况,但也没有翻倒数字变成了另一个数,也是bu ke neng
否则就打印翻到的
根据题意翻到其实就是6->9 or 9->6 遍历时候改变即可!
#include <iostream>
using namespace std;
int main(void){
int n;cin>>n;
while(n--){
int flag=0;
int flag2=0;
string s;cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='2'||s[i]=='3'||s[i]=='4'||s[i]=='5'||s[i]=='7'){
flag2=1;
break;
}
if(s[i]=='6'){
flag=1;
s[i]='9';
}
else if(s[i]=='9'){
flag=1;
s[i]='6';
}
}
if(flag2){
cout<<"bu ke neng\n";
continue;
}
cout<<s<<'\n';
}
return 0;
}
520-6 情侣数
要凑出一个“情侣数”可不太容易。这个数字需要满足以下几个条件:
情侣数必须是一个正整数,并且有偶数位;
将这个数分为位数相同的前一半 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
\leq 10^4
≤104),随后 N 行,每行给出一个绝对值小于
1
0
8
10^8
108
的整数。
输出格式:
在第一行中输出 N 个给定数字中共有几个情侣数,第二行输出最大的那个情侣数。题目保证这个数字一定存在。
输入样例:
5
-2157
6621138
99123199
3112
98762234
输出样例:
2
98762234
样例说明:
样例输入中前 3 个数字都不是情侣数。最后 2 个情侣数中,最后一个数字比较大,所以被输出。
题解:
虽然这是判断数字的题,但根据题意,用字符串+数字的方法更快
首先读取字符串,如果字符串开头是’-',表明是负数,直接舍去
其次判断字符串的长度,如果是奇数也直接舍去
接着遍历前半段和后半段,如果发现前半段不是非递增的或者后半段不是非递减的,那么也可以判断为舍去
最后判断前半段和后半段的奇偶性是不是相反的!
如果以上条件都满足表明是一个情侣数,最后取最大值即可
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(void){
int n;
cin>>n;
int ans=INT_MIN;
int sum=0;
for(int i=0;i<n;i++){
string s;cin>>s;
if(s[0]=='-')continue;
if(s.size()&1)continue;
int flag=1;
//注意边界情况,以免越界导致段错误
for(int i=1;i<s.size()/2;i++){
if(s[i-1]<s[i])flag=0;
}
for(int i=s.size()/2+1;i<s.size();i++){
if(s[i-1]>s[i])flag=0;
}
int sa=0,sb=0;
for(int i=0;i<s.size()/2;i++)sa+=s[i]-'0';
for(int i=s.size()/2;i<s.size();i++)sb+=s[i]-'0';
int num=stoll(s);//字符串转长整型
if((sa&1) != (sb&1)&&flag) { ans = max(ans, num);sum++; }
//奇偶性是否相反和前面是否通过
}
cout<<sum<<endl;
cout<<ans;
return 0;
}
520-7 撒狗粮
网络上称一对情侣秀恩爱为“撒狗粮”,因为单身人士统称为“单身狗”。
在一个大型聚会上,所有宾客被安排坐在一张长条宴会桌边。如果一对情侣坐在一起,那么他们两人身边的单身狗就会被撒一脸狗粮;如果他们没有坐在一起,那么所有被夹在他们两人之间的单身狗都会被撒一脸狗粮。
本题就请你找出被撒狗粮最多(以“脸”为单位)的那位单身人士。
输入格式:
输入第一行给出一个正整数 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
输出样例:
10000 23333 88888
注意:88888 虽然有伴侣,但在聚会上是单身。
题解:
我愿称这题为本场最难!!!
本题如果纯暴力,直接TLE
首先要记录情侣,这里直接map对应即可
然后是读取本场的人员
重点:如何判断被撒狗粮最多的单身人士
做法:将每一个到场人员给一个相应的编号(根据位置,也就是下标即可)(这里从1开始)
那遍历到场人员,遍历到该人员,判断该人员的伴侣是否到场,如果没有到场下标获取应该就是0(初始值)如果到场就可以直接获取这两个情侣的位置!
根据位置,再进行对两边的或者中间的人加上撒狗粮的值,因为可能有多对情侣,情侣位置跨度可能很大,这里直接用差分做会快!
如果该人员和该人员的伴侣都到场了,应该再来个标志,表示这两个人都不是单身狗!
最后用差分数组还原原数组后进行遍历找最大,可能有多个人,应该用数组存一下,最后sort一下打印即可
该程序中途改了挺多,导致数组下标不是统一从0或1开始,看官请认清
#include <iostream>
#include <cstring>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
const int N = 8 * 1e4+10;
map<string ,string>ma;//记录伴侣数组
map<string,int >xiabiao;//记录到场人员下标数组
int b[N];//差分数组
bool yes[N];//标记到场人员是否是单身狗数组
int now[N];//一开始没改差分时候用的原数组,现如今没用的数组
void insert(int l, int r, int c)//差分操作
{
b[l] += c;
b[r + 1] -= c;
}
int main(){
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);//减少cin和cout 时间
int n;cin>>n;
for(int i=0;i<n;i++){
string s,ss;
cin>>s>>ss;
ma[s]=ss;
ma[ss]=s;//记录伴侣,s是ss的伴侣,ss是s的伴侣
}
int m;cin>>m;
vector<string>v(m);//记录到场人员ID号的数组
vector<string>ans;//答案数组
for(int i=0;i<m;i++){
string s;
cin>>s;
v[i]=s;
xiabiao[s]=i+1;//下标从1开始,相当于记录座位号
}
int maxans=0;
for(int i=0;i<m;i++){
if(xiabiao[ma[v[i]]]!=0){
yes[i]=yes[xiabiao[ma[v[i]]]-1]=1;//这边减1是因为上面座位号从1开始
int j=xiabiao[ma[v[i]]]-1;
if(j-i==1){
if(j+1<m)insert(j+2,j+2,1);
if(i-1>=0)insert(i,i,1);
}
else if(j>i){
insert(i+2,j,1);
}
}
}
for (int i = 1; i <= m; i ++ ) b[i] += b[i - 1];
for(int i=0;i<m;i++){
if(yes[i])continue;//如果是有伴侣的
if(b[i+1]>maxans){//这里i+1是因为差分那边下标从1开始!
maxans=b[i+1];
ans.clear();
ans.push_back(v[i]);
}
else if(b[i+1]==maxans)ans.push_back(v[i]);
}
sort(ans.begin(),ans.end());//排序,按 ID 递增顺序列出
for(int i=0;i<ans.size();i++){
if(i)cout<<' '<<ans[i];
else cout<<ans[i];
}
return 0;
}
520-8 相亲大会
某婚恋网站组织了一场相亲大会。组织者手里有一份签到表,按座位号的顺序列出前来参会的客人。但客人们要根据这份表找到自己的座位编号就很麻烦了。本题就要求你编写程序,帮助来参会的客人们快速找到他们的座位号。
输入格式:
输入第一行给出一个不超过
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
输出样例:
4
Sorry
1
Sorry
题解:
签到题
注意cin和cout拖慢速度导致TLE,需要开IOS
一个map记录一下然后判断即可
#include <iostream>
#include <map>
using namespace std;
map<string,int>ma;
int main(void){
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);//不开会TLE!
int n;cin>>n;
for(int i=0;i<n;i++){
string s;cin>>s;
ma[s]=i+1;
}
int m;cin>>m;
for(int i=0;i<m;i++){
string s;cin>>s;
if(ma[s])cout<<ma[s];
else cout<<"Sorry";
cout<<'\n';
}
return 0;
}