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

    xiaoxiao2025-03-12  28

    山东省赛打完基本算法比赛就没有可打的了,蓝桥没进国赛,只能留在宿舍看家,随手报了一个山理工的比赛,结果睡醒就只有一个半小时了,随缘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; }
    最新回复(0)