“华为杯”山东理工大学第十一届ACM程序设计竞赛(正式赛)网络同步赛

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43849505/article/details/90578040

山东省赛打完基本算法比赛就没有可打的了,蓝桥没进国赛,只能留在宿舍看家,随手报了一个山理工的比赛,结果睡醒就只有一个半小时了,随缘A了6道。

A 猜先
Problem Description
小 A 和小 B 最近开始学习下围棋, 小 A 和 小 B 先学的的是围棋礼仪中的猜先。
猜先是一种决定两个人谁拿黑棋,谁拿白棋的一种方法。猜先的方法是这样的:小 B 先去抓一把白子, 然后让小 A 猜,如果小 A 觉得小 B 手中的白子是奇数个,小 A 就拿 1 颗黑子;否则就拿 2 颗黑子。 之后小 B 把手中的白子放在棋盘上,如果小 A 猜对了,小 A 就拿黑棋 ;否则小 A 就拿白棋。

Input
输入两个正整数 a 和 b ( a = 1 或 2,1<=b<=10),其中 a 代表小 A 拿的黑子数,b 代表小 B 拿的白子数。

Output
如果小 A 猜对了,输出“black”,否则输出“white”。(输出不包括引号)

Sample Input
2 8
Sample Output
black
Hint

前面几道都是水题,当拿出的黑子数和B的白子数同奇偶,小A拿黑,否则拿B
AC代码

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
	int a,b;
	cin>>a>>b;
	if(a%2==b%2)
		cout<<"black"<<endl;
	else 
		cout<<"white"<<endl;
	return 0;
}

B Digit deletion
Problem Description
给定5个自然数,从中挑选出4个数,并计算它们的和。求出所有挑选方式中和最大以及和最小的情况,并将其输出。

Input
一行,5个小于10000的自然数。

Output
两个数,分别表示最小的和以及最大的和。

Sample Input
1 2 3 4 5
Sample Output
10 14
Hint

继续水题,排序就完事了
AC代码

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int num[5];
int main()
{
	for(int i=0;i<5;i++)
		cin>>num[i];
	sort(num,num+5);
	int mmin=num[0]+num[1]+num[2]+num[3];
	int mmax=num[4]+num[3]+num[2]+num[1];
	cout<<mmin<<" "<<mmax<<endl;
	return 0;
}

C 沉心十年
Problem Description
今年是SDUTACM举办的第十一届校赛啦!
今年校赛的参赛规模也是再创新高!在今天的赛场上与大家同台竞技的,还有50多个来自中小学的小朋友。
十年风雨,我们曾经一起走过。现在让我们脚踏实地,一起奋斗下一个十年!
现在请你使用’SDUTACM’这一个字符串,打印出只属于今天的的专属图形。

Input
一个整数n,代表正方形的规模。(5<=n<=50)

Output
如样例所示的一个字母正方形。

Sample Input
5
Sample Output
SDUTA
C M
S D
U T
ACMSD
Hint
注意正方形的任意两行之间都没有空行。

一道很简单的模拟,注意好字符串到头的时候换回来。还有一点,山理工的出题人莫非喜欢坑人,虽然题目规定了N的限制,但似乎并没有按照这个来,昨天的热身赛就出现了这个状况,不按照题目给的限制才能过,这次也是,不用数组存放而是直接输出就可以过。

AC代码

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
char Map[55][55];
string str="SDUTACM";
int main()
{
	int n,k=0;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		if(i==0||i==n-1)
			for(int j=0;j<n;j++)
			{
				cout<<str[k];
				k++;
				if(k==str.length())
					k=0;	
			}
		else
		{
			cout<<str[k];
			k++;
			if(k==str.length())
					k=0;
			for(int j=1;j<n-1;j++)
				cout<<" ";
			cout<<str[k];
			k++;
			if(k==str.length())
					k=0;
		}
		cout<<endl;
	}
	
	return 0;
}

E 九连环
不知道大家有没有玩过一个叫做 九连环 的玩具,如下图所示。
在这里插入图片描述
如果你不了解九连环,那玄黄就带你领略九连环的奥妙:
九连环是我国传统的民间智力玩具,玩具上面有九个连环套在杆上,目标就是通过一定的方式将九个连环从杆上全部取下来。
玩法是这样的:
1、对每个环,有2种操作:把这个环放到杆上或把这个环从杆上取下
2、你可以随意的对第1个环进行操作
3、如果你想对第i个环(i>1)进行操作,你必须将第i-1个环放在杆上,且必须把前i-2个环从杆上取下

Input
输入一个整数n ( 0<n<10 ),代表杆上面的连环个数。

Output
输出把所有连环取下来的最少操作步骤,每一步占一行,输出一个整数i和操作”UP”或者”DOWN”,代表将第i个环放到杆上或从杆上取下来,整数和操作用空格分开。详情见示例输出。

Sample Input
4
Sample Output
2 DOWN
1 DOWN
4 DOWN
1 UP
2 UP
1 DOWN
3 DOWN
1 UP
2 DOWN
1 DOWN

就是递归,具体操作类似于模拟汉诺塔问题,处理好递归的过程即可。

AC代码

#include<iostream>
#include<stdio.h>
using namespace std;
int shangmian[10];
void xie(int n) {
	if(n == 1)
	{ 
		printf("%d DOWN\n",n);
		shangmian[n] = 0; 
		return; 
	}
	if(shangmian[n - 1] == 0)
		zhuang(n - 1);
	for (int i = n - 2; i >= 1; i--)
		if (shangmian[i] == 1)
			xie(i);
			
	printf("%d DOWN\n",n); 
	shangmian[n] = 0;
	return;
}
 
void zhuang(int n) {
	if (n == 1) 
	{ 
		printf("%d UP\n", n);
		shangmian[n] = 1; 
		return; 
	}
	if (shangmian[n - 1] == 0) 
		zhuang(n - 1); 
	for (int i = n - 2; i >= 1; i--) 
		if (shangmian[i] == 1) 
			xie(i); 
 
	printf("%d UP\n", n);shangmian[n] = 1;
	return;
}
 
int  main() 
{
 	int n;
 	cin>>n;
	for (int i = 0; i < 10; i++) 
		shangmian[i] = 1; 
	for (int i = n; i >= 1; i--) 
		xie(i); 
	return 0;
}

J 定向运动
Problem Description
定向运动是一项非常有意思的体育活动。

在本题中,为了简化问题,我们将定向运动描述如下:两人组队,一共有5个不同的项目A,B,C,D,E,在规定时间内,每个人尽可能多的去完成这些项目,完成计1,否则计0。在本题中,我们使用一个5位字符串来定表示个人5个项目的分值。
例如,小明的分数字符串为“11110”,这代表他完成了项目A,B,C,D。两人团队的分值计分方式如下:对于每个项目,只要两人团队有一个人完成此项目,则此项目计1,否则此项目计0。
例如 小明的分数字符串为“11011”,小玉的字符串为”10010”,则最后两人得分为4。现在假设在一次定向运动中,有n个人参加比赛,并且有m个项目,计分方式如上所示。但是,组队的信息未知。
请你计算出在所有可能的2人团队中,最大的得分是多少以及有多少种组合方式可以得到最大得分。

Input
单组输入。
第一行包含两个用空格分开的整数 n, m ,分别代表参加的人数和项目数。
接着有n行,每一行包含一个长度为 m 的字符串。( 2<=n<=50,1<=m<=500)

Output
在第一行,输出所有2人团队可以获得最大得分。
在第二行,输出有多少种组合方式可以获得最大得分。

Sample Input
4 5
10101
11100
11010
00101
Sample Output
5
2

题目估计数据比较水,用暴力DP过了,dp[i][j][k]表示第i个和第j个字符串到第k位为止最大的得分,那么不难得出状态转移方程dp[i][j][k]=dp[i][j][k-1]+max(str[i][k]-‘0’,str[j][k]-‘0’),然后就是暴力,估计打了擦边球,数据量比较小,所以这样暴力还可以过,不然肯定超时。
AC代码

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<set>
using namespace std;
string str[55];
int dp[55][55][505];
int main()
{
	int n,m;
	int mmax=-1;
	int cnt=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>str[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			for(int k=0;k<m;k++)
				dp[i][j][k]=dp[i][j][k-1]+max(str[i][k]-'0',str[j][k]-'0');
			if(mmax<dp[i][j][m-1])
			{
				mmax=dp[i][j][m-1];
				cnt=0;
			}
			if(mmax==dp[i][j][m-1])
				cnt++;
		}
	}
	cout<<mmax<<endl;
	cout<<cnt<<endl;
}

K 矩形的外接圆
在这里插入图片描述
现在有一个矩形ABCD,现在请你计算出 这个矩形的外接圆中 没有 被矩形覆盖的部分的面积。
注: π ≈ 3.14159265 或 π = arccos(-1)

Input
输入数据占一行。输入2个整数 a 和 b (0 < b ≤ a ≤ 50),其中 a 表示矩形的长, b 表示矩形的宽。

Output
输出一个浮点数,代表所求区域的面积。输出数据保留3位小数。

Sample Input
1 1
Sample Output
0.571

最后又一道水题,就是简单的初中几何。
AC代码

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
	double a,b;
	cin>>a>>b;
	double  pi=3.14159265;
	double ans=pi*(a*a+b*b)/4-a*b;
	printf("%.3lf\n",ans);
	return 0;
}
展开阅读全文

没有更多推荐了,返回首页