QLU ACM 2018新生赛

小蒟蒻也想学大牛们写一下题解啦~虽然很弱小 但是写博客是个好习惯 而且是走向神犇道路的必经之路 所以lets start!!
这次比赛有好几个题在场上脑子突然短路,不知道为什么很简单的题就是想不起来,封榜的时候是第13名,因为没有做出来题最后铜奖组第一名惨淡收场…刚看到排名和铜奖的时候我的心是哇凉哇凉的 不过后来转念一想 没有关系!我才刚刚开始 有好多事情我还没有经历过!所以我会以这次比赛为契机 在我松懈的时候时刻想着这次的比赛, 积极参加各种比赛 虽然可能不会获得什么好的名次 ,但是我也把这些当做我的经历和锻炼 相信这些和相信着我的在我背后的人会推动着我加快我的脚步 走的更远!(小蒟蒻说这个感觉很慌 不过确实是真心话!!!

问题 M: 签到题
题目描述
恭喜你发现一道签到题,请输出“check in”来解决这道问题。

输入

输出
check in

样例输入

样例输出
check in
第一题是一道签到题 就不多说了 幸亏我发现这道题a的比较早(笑

#include<bits/stdc++.h>
using namespace std;
int main() {
	cout<<"check in";
}

问题 B: Alice and Bob
命题人:admin

题目描述
Alice and Bob decide to play a game. At the beginning of the game they put n piles of sweets on the table.The number of each pile of sweets may be different. Alice and Bob take away sweets in turn,and always Alice takes sweets first in every games.Each time in their turn they can get only one whole pile of sweets.When there is no sweet left, the game is over. Finally, The man who have the largest number of sweets in hand will win.
Assume that Alice and Bob were very clever.

输入
The first line is an integer n, which means that there are n pile sweets.
1 <= n <= 100000
Next n integers, the i-th integer means the number of sweets in the i-th pile.
The number of sweets in each pile is less than 10000.

输出
If Alice wins, output “A”, and if Bob wins, output “B”.
Otherwise output “again”

样例输入
样例输入1:
3
1 6 7

样例输入2:
4
3 3 3 3
题目大意为桌子上有很多堆糖果,每一堆糖果的数量可能不相同,这个Alice姐姐和Bob玩一个游戏 每个人一次拿一堆,比较最后谁拿到的糖果比较多。
反思:当时没有注意最后一句她们都很clever 把那一句当做了废话处理。。。所以没有进行排序 当天晚上加了一行sort就对了= = 挺难受的也 上代码: (下次一定把题目全部吃透!

#include<bits/stdc++.h>
using namespace std;
int b=0,c=0;
unsigned long long int a[200000];
bool cmp(int a,int b) {
	return a>b;
}
int main() {
	long long int  n;
	cin>>n;
	for(int i=1;i<=n;i++) {
	cin>>a[i];
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++) {
	if(n==1) {
		if(a[n]<=0)
		cout<<"again";
		else if(a[n]>0)
		cout<<"A";
		return 0;
	}
	else if(n>1&&(i%2!=0))
	b+=a[i];
	else if(n>1&&(i%2==0))
	c+=a[i];
	}
	if(b>c)
	cout<<"A";
	else if(b<c)
	cout<<"B";
	else if(b==c)
	cout<<"again";

} 

问题 C: 黑白黑
命题人:admin

题目描述
黑白黑是一个很经典的游戏,规则也非常简单。三个人同时伸出一只手,手心为白,手背为黑,如果有两人为黑一人为白,或者两人为白一人为黑,则单独伸出手心或者手背的那个人就输了。
又是一个周末,小A小B小C他们仨个懒虫又睡到了中午,外卖送到楼下了也不想下楼拿,于是他们决定用这个游戏来选出一个输的人去拿外卖。

输入
三个整数
a b c
(0 <= a,b,c <= 1)
a表示小A
b表示小B
c表示小C
0表示伸出的手背
1表示伸出的手心

输出
如果有人输了则输出他的名字A/B/C(大写)
平局则输出"aha"(不含引号)

样例输入
样例输入1:
0 0 0

样例输入2:
1 1 0

样例输出
样例输出1:
aha

样例输出2:
C
这是一道水题 只需要几个if就ok(小时候玩游戏配一家的时候用过很多次这个,没想到现在还能遇到,还有点怀念2333 废话不多说咯 上代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
	int a,b,c;
	cin>>a>>b>>c;
	if((a==0&&b==0&&c==0)||(a==1&&b==1&&c==1))
	cout<<"aha";
	else if((a==1&&b==1&&c==0)||(a==0&&b==0&&c==1))
	cout<<"C";
	else if((a==1&&b==0&&c==1)||(a==0&&b==1&&c==0))
	cout<<"B";
	else if((a==0&&b==1&&c==1)||(a==1&&b==0&&c==0))
	cout<<"A";
} 

问题 E: are you ok?

题目描述
小朋是一家超市的老板,他经常会来超市检查,每次都会让仓库管理员列出仓库中剩余商品的数量。但是仓库管理员是个非常健忘的人,有时候商品都卖光了也不去进货,这会让老板非常生气,因为这样超市卖不出去东西就没办法赚钱了。小朋有句口头禅"are you ok?",如果发现所有商品的库存都为0的话,就会非常生气地喊出"are you ok?",大声地质询仓库管理员。
现在你就是仓库管理员,每次面对小朋的询问,你都会在电脑系统中对库存进行查询,然后列出剩余商品的清单。(如果所有商品库存都是0,那你就没办法交差了,你的老板会非常生气)。

输入
第一行一个整数n,表示有n种货物
(2 <= n <= 100)
往下一行有n个字符串s1,s2…si…sn 表示系统显示的第i种货物的名称(1<=i<=n)
(字符串长度不超过10)
往下一行有n个整数a1,a2…ai…an 表示系统显示的第i种货物的库存(1<=i<=n)
(每种货物库存数量 <= 1000)

输出
如果还有商品(哪怕只有一个),你也可以列出剩余商品的清单。
否则你就只能挨老板骂了。

样例输入
样例输入1:
4
a b c d
0 0 0 0

样例输入2:
5
apple egg milk desk light
0 1 2 0 1

样例输出
样例输出1:
are you ok?

样例1的说明:
所有的商品都没库存, 你的老板会非常生气

样例输出2:
egg x 1
milk x 2
light x 1
(x前后有空格)

这道题刚看到让我想起了雷军那首are you ok hhhh 脑子里真的出现了那个熟悉而又魔性的旋律(笑哭)
这题只需要使用一下struct结构体 判断是否为0 输出即可咯 代码:

#include<bits/stdc++.h>
using namespace std;
int f=0;
struct node {
	string name;
	int num;
}a[2000];
int main() {
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>a[i].name;
	for(int i=0;i<n;i++)
	cin>>a[i].num;
	for(int i=0;i<n;i++) {
		if(a[i].num!=0) {
			cout<<a[i].name<<" x "<<a[i].num<<"\n";
			f=1;
		}
	}
	if(f==0)
	cout<<"are you ok?";
} 

are you ok? 反正拿了铜奖的我非常的不ok==!
问题 G: 数数
题目描述
小凯今年上一年级了,他只学会了0-9这十个数字,对于两位以上的数字,小凯自创了一套读法。
连续出现的x个y,小凯将其读作“xy”
比如:11 小凯读作"21" (连续2个1)
21 小凯读作"1211" (连续1个2 连续1个1)
99 小凯读作"29" (连续2个9)
310 小凯读作"131110"(连续1个3 连续1个1 连续1个0)
330111 小凯读作"231031"(连续2个3 连续1个0 连续3个1)
给定一个由数字组成的字符串n(2 <= |n| <= 100),请输出小凯对n的读法
|n|表示字符串n的长度
保证连续出现同一个数字的次数不会超过9次(因为小凯最多只能数到9)
比如:2223311111111118(非法,因为数字1连续出现了10次)

输入
由纯数字组成的一行字符串

输出
在小凯的自创规则下这一长串数的读法

样例输入
13145

样例输出
1113111415
这道题就是当时在场上脑子抽掉的真实代表 本来很简单的一道题目让我想的非常复杂,倒是我在场上做题的时候心态都崩了 直接放弃了这道题 同上 这道题回到宿舍立马就ac了 (心情复杂.jpg 上代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
	string a;
	cin>>a;
	int sum=1;
	for(int i=0;i<a.size();i++) {
		if(a[i]==a[i+1])
		sum++;
		else {
			cout<<sum<<a[i];
			sum=1;
		}
	}
}

问题 H: 神奇老虎机

不知道你有没有玩过老虎机,现在小明面前有一台神奇的老虎机,这台机器有n个滚轮,从左往右数第i个滚轮包含1到a_i的整数(包括1和a_i)。在按下按钮之后,所有的滚轮都会飞速旋转,最终停下来,每个滚轮将显示其中一个整数。这个过程是随机的。小明有一个有趣的想法,如果将滚轮显示的数字连接起来看做一长串字符串的话,将会有非常多的可能,在这所有的可能中字典序最小的字符串是哪个?(只能从左向右读)

对于字典序的说明:
两个字符串S和T,从前往后比较,如果存在一个位置,在该位置两个字符串的字符不同,则比较小的那个所在的字符串字典序更小。
例如: 123的字典序比14的小,因为在第二个位置上2小于4
12345的字典序比9的小
220的字典序比22的大,因为22是220的一个前缀

输入
一个整数t,表示有t组数据(1 <= t <= 100)
每组第一行为一个整数n表示老虎机有n个滚轮
(1 <= n <= 1000)
第二行为n个整数(a_1 a_2 … a_i … a_n )
表示第i个滚轮上的数字范围(1~a_i)
(1 <= a_i <= 100)

输出
每组输入对应一行输出,输出字典序最小时老虎机滚轮上显示的数字
两个数字之间用空格隔开

样例输入
2
4
6 6 6 6
2
2 2

样例输出
1 1 1 1
1 1

提示
老虎机上显示的数都不含前导0
比如:某一块滚轮包含[1,33],如果它显示"1"的话,显示的是"1"而不是"01"

对于样例2的解释:
所有情况分别为:“1 1”、“1 2”、“2 1”、“2 2”
其中"1 1"是字典序最小的,所以答案为"1 1"
还有一张图 由于技术原因就不放出来啦2333 这道题其实也不是很难做 只是需要特判一下最后一位数 即下面代码的j==n-1 题目写的22的字典序比220大 因为要输出字典序最小的 所以最后一位不能有0 必须是1 于是当最后一项的时候 输出1和换行即可 代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
	int t,n,x;
	cin>>t;
	for(int i=0;i<t;i++) {
		cin>>n;
		for(int j=0;j<n-1;j++) {
			cin>>x;
			if(x<10)
			cout<<1<<" ";
			if(x>=10&&x<100)
			cout<<10<<" ";
			if(x==100)
			cout<<100<<" ";
		}
		cin>>x;
		cout<<1<<" \n";
	} 
}

问题 I: 五环
题目描述
提到五环,我想大家都非常熟悉。“啊五环你比四环多一环~~”
不好意思 跑题了。。。
奥运五环由蓝、黄、黑、绿、红五种颜色的圆环组成。
小迪认为五个圆环分别代表五大洲:
蓝色 = 欧洲
黄色 = 亚洲
黑色 = 非洲
绿色 = 大洋州
红色 = 美洲
对应英文为
Blue = Europe
Yellow = Asia
Black = Africa
Green = Oceania
Red = America

输入
输入一行字符串
字符串为五环的颜色或者五个大洲的名称

输出
如果输入的是颜色则输出对应的大洲
如果输入的是大洲则输出对应的颜色

样例输入
Blue

样例输出
Europe
这个题我想起来用我刚学的map 还有第二种方法(代码2)
代码1:

#include<bits/stdc++.h>
using namespace std;
map<string,string>a;
int main() {
	a["Blue"]="Europe";
	a["Yellow"]="Asia";
	a["Black"]="Africa";
	a["Green"]="Oceania";
	a["Red"]="America";
	a["Europe"]="Blue";
	a["Asia"]="Yellow";
	a["Africa"]="Black";
	a["Oceania"]="Green";
	a["America"]="Red";
	string b;
	cin>>b;
	cout<<a[b];
}

如果巧妙运用map的话很多题都是可以轻松解决的拉~
代码2:

#include<bits/stdc++.h>
using namespace std;
int main() {
	string a;
	cin>>a;
	if(a=="Blue")
	cout<<"Europe";
	else if(a=="Yellow")
	cout<<"Asia";
	else if(a=="Black")
	cout<<"Africa";
	else if(a=="Green")
	cout<<"Oceania";
	else if(a=="Red")
	cout<<"America";
	else if(a=="Europe")
	cout<<"Blue";
	else if(a=="Asia")
	cout<<"Yellow";
	else if(a=="Africa")
	cout<<"Black";
	else if(a=="Oceania")
	cout<<"Green";
	else if(a=="America")
	cout<<"Red";
} 

问题 J: 开挂的小洋
命题人:admin

题目描述
最近小洋迷上了一款名叫打地鼠的游戏,但是小洋是个游戏白痴,这么简单的游戏也总是得不到几分,有一天他发现这款游戏可以在网络上买到外挂,这款外挂可以提前预知所有地鼠出现的时间,并且他可以开局得到两把锤子,之前小洋1s只能挥动一次锤子,现在他左右开弓可以同时打中最多两只地鼠。每只地鼠在第i秒出现,在第i+1秒的时候就会消失。也就是说在第i秒小洋只能打到这一秒出现的地鼠,(i-1)秒以及(i+1)秒出现的地鼠他都没办法打中。

输入
一个整数n,表示地鼠的数目
一个整数m,表示此次游戏时长
接下来n个整数a_1-a_n,表示地鼠会在第a_i秒出现
1 <= a_i <= m
1 <= n <= 1000;
1 <= m <= 100000;
每只地鼠最多停留一秒

输出
一个整数,表示小洋最高得分(每打中一只地鼠得一分)

样例输入
样例输入1:
4
9
1 1 4 7

样例输入2:
6
10
3 3 3 3 9 1

样例输出
样例输出1:
4

样例输出2:
4

提示
对于样例1的解释:
第1秒出现两只地鼠 左右开弓两只全打中得2分
第4秒出现一只地鼠 打中得1分
第7秒出现一只地鼠 打中得1分
最终得分4分

对于样例2的解释:
第1秒出现一只地鼠 打中得1分
第3秒出现四只地鼠 两把锤子最多打中两只 得2分
第9秒出现一只地鼠 打中得1分
共4分
这题使用了桶的思想 注意桶要开的大一点~ 代码:

#include<bits/stdc++.h>
using namespace std;
int a[200000];
int main() {
	int n,m,count=0,b;
	cin>>n>>m;
	for(int i=0;i<n;i++) {
		cin>>b;
		a[b]++;
	}
	for(int i=0;i<200000;i++) {
		if(a[i]!=0) {
			if(a[i]>=2)
			count+=2;
			if(a[i]==1)
			count+=1;
		}
	}
	cout<<count;
}

问题 K: 数字匹配
题目描述
给出两个元素数量都为n的数组a和数组b。对于数组a中的每个元素,都必须找一个(而且最多一个)数组b中的元素进行匹配,数组b中的所有元素也都要被匹配到,也就是说一一匹配。匹配完成后,相互匹配的元素相乘,然后把所有的积相加。
例如:
数组a:1 5 3
数组 b:2 3 4
如果a中第一个元素跟b中第三个元素匹配,第二个元素跟b中第二个元素匹配,第三个元素跟b中第一个元素匹配,匹配完后相乘得到 14、53、32,求和得到结果14+53+32=25。
如果a中第一个元素跟b中第二个元素匹配,第二个元素跟b中第三个元素匹配,第三个元素跟b中第一个元素匹配,匹配完后相乘得到 13、54、32,求和得到结果13+54+32=29。

给出n和两个数组,分别计算求和的最大结果与最小结果。

输入
第一行 一个数n,表示两个数组元素的个数 1<=n<=1000。
第二行 n个数 表示数组a的各个元素ai,0<ai<=1000 ai为正整数,(1<=i<=n)。
第三行 n个数 表示数组b的各个元素bi,0<bi<=1000 bi为正整数,(1<=i<=n)。

输出
两个数 分别表示最大结果和最小结果。最大结果和最小结果可以相等。

样例输入
3
1 5 3
2 3 4

样例输出
31 23
这道题目可以说是我最亏的题目 没有之一。。。 我做洛谷做惯了 于是就想枚举每一种可能性,然后把结果存到一个数组里 排序以后输出第一项和最后一项 可能我的思维在那时候直接江化了 固定思维觉得这样做不出来就没法做 忽略了思考的过程 其实只要排序一下 然后再降序拍一下 一相乘就出现了一个最大值和最小值
(当时没想到真实的脑子抽了 代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[2000],b[2000];
bool cmp(int a,int b) {
	return a>b;
}
int main() {
	 int n,maxn=0,minn=0;
	 cin>>n;
	 for(int i=0;i<n;i++)
	 cin>>a[i];
	 for(int i=0;i<n;i++)
	 cin>>b[i];
	 sort(a,a+n);
	 sort(b,b+n);
	 for(int i=0;i<n;i++) {
	 		maxn+=a[i]*b[i];
		 }
	sort(b,b+n,cmp);
	for(int i=0;i<n;i++)
	minn+=a[i]*b[i];
	 cout<<maxn<<" "<<minn;
	
	 }

这道题没做出来真的是哭晕在厕所啊 当时我那个排名旁边只有我 没做出来。。。

这些就是我能写的所有的题解了…果然蒟蒻就是蒟蒻 不知道有没有人可以和我产生共鸣 以后我学会了别的题目会再次更新这篇博客

另外 QLU ACM的大家 一起努力吧!相信我们一定会创造辉煌!!!冲鸭!!!!

猜你喜欢

转载自blog.csdn.net/weixin_43537190/article/details/84570246
今日推荐