BUCTOJ2021年ACM竞赛班训练九题解

  • 问题A
  • 问题B
  • 问题C
  • 问题D
  • 问题E
  • 问题F

问题A

原题链接
A题题解:
首先让我们看看这个题的题目,ummm…好像要找题目,好吧,我们去看看题目在哪里。

A题是一个考察html+css的题目,这时我们需要打开浏览器自带的网页源码解析功能,点击F12我们可以看到该网页的源代码

之后我们发现有一行奇怪的代码,我们将鼠标移动到这个代码上,蓝色框所框选的是一个网页的遮蔽层。

因此我们直接尝试删除该代码看看得到的结果是不是符合我们的预期。

好了,然后我们就可以按照题目要求完成题目了,因为就是一个简单的加法问题,就不再赘述。
AC代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){ios::sync_with_stdio("false");cin.tie(0);int a,b,c;cin>>a>>b>>c;cout<<5*a+2*b+c+1314<<ends;return 0;
}

问题B

题目链接
首先让我们回顾一下题目:
题目描述:
鼠宝宝将一个字符串S分割成N个子串S(1),S(2)…S(N),并且每一个相邻的子字符串都不能一样,即S(i)!=S(i+1),他现在想知道N最大可以是多少。

例如aabbaa可以拆成a,ab,b,aa这4个,4即为最大的N
问题B是一个贪心的题目,判断条件是如果当前字符串与新的字符串相同就增加一位再进行判断,不一样就更新数组进行新的判断,并且最长的串长度不超过2
AC代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{int n;scanf("%d",&n);char s[n];scanf("%s",s);int ans=0;int h=0;for(int i=1;i<n;){if(s[i]==s[h]){ans++;h+=3;i+=3;}else {i++;h++;}  }printf("%d",n-ans);return 0;
}

问题C

原题链接
首先让我们回顾一下题目:
题目描述
假设你是北京化工大学的acm集训队的教练。在你的监督下有n个学生,每个学生都有各自的能力值。你必须为一个新的编程比赛创建一个团队。如你所知,一个队的学生越多,获胜的可能性就越大!但是还有一个限制条件,如果一个团队中的两个学生的能力值相差超过了5(不包括5),那么这个队伍必输无疑!你的任务是在一个平衡的团队中找到尽可能多的学生。

C题是考察区域最大值的问题,该问题描述比较复杂,我们可以直接简化为如下问题:
给定一串数,以5为宽度的区间中数最多的是多少。因此我们可以直接想到和离散化相同的前几部,排序去重,接着我们需用一个新的数组来存储去重前的某数出现的频次。接着我们直接以5为宽度寻找最大值输出即可。
AC代码如下:

#include<bits/stdc++.h>
#define max(a,b) (((a)>(b))?(a):(b))
#define min(a,b) (((a)>(b))?(b):(a))
#define rep(i,a,b)  for(int i=(a);i<(b);i++)
using namespace std;
int a[100005];
int c[100005];
int main(){int n,cnt=0;cin>>n;rep(i,0,n)  cin>>a[i];sort(a,a+n);memset(c,0,sizeof(c));rep(i,0,n){if(a[i]!=a[cnt]){cnt++;a[cnt]=a[i];}c[cnt]++;}int max=1,min=0,tmp=0;rep(i,0,cnt+1){if(a[i]-a[min]<=5){tmp+=c[i];}else{tmp+=c[i];while(a[i]-a[min]>5){tmp-=c[min];min++;}}if(tmp>max) max=tmp;}cout<<max;
}

问题D

原题链接
问题描述很长,而且还是一个英语问题,因此我们就不粘贴原题了,我们寻找了有道小助手帮助我们,题目大概的意思是

概括一下题意
给出一张图,求k边最短路,即经过k条边的最短路。
分析
思考一下:如果一个矩阵,表示走k条边后,一张图的点与点的最短路径,(a,b)表示从a到b的最短路径,然后我们把它与自己,按照矩阵乘法的格式“相乘”,把其中的乘改为取minc.a[i][j] = min(c.a[i][j],x.a[i][k]+y.a[k][j]);看不懂先看下面。

这样得到的是走k+k条边的矩阵。有点抽象,下面详细解释下:
c中的一个点(a,b),当我们用x矩阵和y矩阵求它时,我们枚举了x矩阵的a行所有数,与y矩阵的b列所有数,并且他们的坐标只能是相对应的,比如x矩阵的(a,2)这个点,相应的y矩阵点就是(2,b),那么放到图上去理解,即从a点经过2点到b点的距离,类似的点不只有2,把所有点枚举完后,c.a[a][b]就是从a到b的最短距离。(意会一下)
这样下来,会得到走k+k条边的最短路径,对于其他的矩阵这样操作,得到的是他们两个,经过的边数相加的结果。(一个经过a条边后的矩阵 与 一个经过b条边后的矩阵这样操作后,是经过a+b条边后的矩阵,矩阵中存的是最短路径)。解释一下:向上面的例子一样,(a,2)(2,b),是即从a点经过2点到b点的距离,因为x矩阵和y矩阵都是走k条边后的最短路径,那么x矩阵中的(a,2)是走k步后的最短路径,(2,b)也是,那么他们相加不就是走k+k条边后的最短路径吗?其他的矩阵一样。

然后,就可以套用快速幂的模板了,只不过将以前的乘改成加了,也就是倍增的思想的,比如对于走10条边,它的二进制是1010,那么我们就让在走2(10)边时的矩阵 乘以 8(1000)边的矩阵,得到走10条边的矩阵即开始时由1->2->4->8->16……即倍增中的2次幂。
AC代码如下:

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 210;
int Hash[1010];
int n,k,q,z,tn;
int read()
{int x = 0,f = 1;char ch = getchar();while (ch<'0'||ch>'9') {if (ch='-') f=-1;ch = getchar(); }while (ch>='0'&&ch<='9'){x = x*10+ch-'0';ch = getchar(); }return x*f;
}struct Matrix{int a[MAXN][MAXN];Matrix operator * (const Matrix &x) const{Matrix c;memset(c.a,0x3f,sizeof(c.a));for (int k=1; k<=tn; k++)for (int i=1; i<=tn; ++i)for (int j=1; j<=tn; ++j)c.a[i][j] = min(c.a[i][j],a[i][k]+x.a[k][j]);return c;}
}s,ans;
void ksm()
{ans = s;k--;for (; k; k>>=1){if (k&1) ans = ans*s;s = s*s;}
}
int main()
{k = read();n = read();q = read();z = read();memset(s.a,0x3f,sizeof(s.a));for (int x,y,w,i=1; i<=n; ++i){w = read();x = read();y = read();if (!Hash[x]) Hash[x] = ++tn;if (!Hash[y]) Hash[y] = ++tn;s.a[Hash[x]][Hash[y]] = s.a[Hash[y]][Hash[x]] = w;}ksm();printf("%d",ans.a[Hash[q]][Hash[z]]);return 0;
}

问题E

原题链接
首先我们回顾一下题面。
题目描述
设有N个正整数(N<=20),将它们联成一排,组成一个最大的多位整数。 例如:N=3时,3个整数13、312、343联成的最大整数为:34331213; 又如:N=4时,4个整数7,13,4,246联成的最大整数为:7424613;

我们可以直接发现这个题目就是一个按照字典序排序的题目,举个简单的栗子:9>99>999>98>989为什么这样呢,因为9之后的数是任意的,而99的第二位被限定为了9,举一个直观的例子,假如现在是9与98,那么最大的组成数是998,因为9>98,以此类推我们就得到了排序的规律,然后写个代码即可。
AC代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int solve(int a,int b)
{                                      int a1=a,b1=b,la=10,lb=10;while(a/la){la*=10;}while(b/lb){lb*=10;}return (a*lb+b)-(b*la+a);
}
int main()
{int i,j,n;int data[100],temp;while(cin>>n && n){for(i=0;i<n;i++){cin>>data[i];}for(j=0;j<n-1;j++)for(i=0;i<n-1-j;i++){if(solve(data[i],data[i+1])<0){temp=data[i+1];data[i+1]=data[i];data[i]=temp;}}for(i=0;i<n;i++){printf("%d",data[i]);}printf("\n");}return 0;
}

问题F

原题链接
问题F:
首先我们回顾一下题面:
题目描述
• 2021年5月15日,中国探测器登上火星!这是一个值得纪念的日子。
• 2137年,中国CNSA研制成功了可以登上火星的载人飞船。
n个人乘坐k个飞船去火星,每个飞船视为相同,问有多少中乘坐方法?

注意,如果有空的飞船,CNSA是不会点火的。所以请保证每艘飞船都有人。
我们可以发现该题是一个组合求数量的问题,该问题的前一项与后一项之间好像存在着关系,因此我们可以想到是一个dp问题,这里我们使用的是反向的dp,先确定初值dp[25][25]=0,然后我们就列出几项来寻找一下其中的规律,列出状态转移方程如下
dp[n][k]=dp[n-1][k-1]+k*dp[n-1][k]
dp[1][1]=1

最后输出dp[n][k]即可得到我们想要的答案。
AC代码如下:

#include<bits/stdc++.h>
using namespace std;
long long int num[25][25]={0};
long long int fun(int n,int k)
{if(n==k||k==1) return num[n][k]=1;
return num[n][k]=fun(n-1,k-1)+k*fun(n-1,k);
}
int main(){int n,k,i;long int sum1=1,sum2=1;cin>>n>>k;cout<<fun(n,k);return 0;
}

BUCTOJ2021年ACM竞赛班训练九题解相关推荐

  1. buctoj2021年ACM竞赛班训练(七)题解

    A: 玩游戏 题意:初始有一堆石子共n个,双方轮流行动,每次可以从中取出恰好完全平方数(1.4.9--)个石子,不可以不取石子直接跳过回合.双方都足够聪明,会按最优的方式来游玩,无法行动的人输掉该游戏 ...

  2. 2021年ACM竞赛班训练(六)题解

    2021年ACM竞赛班训练(六)题解 ==Problem A 逆元== 题目描述 输入 输出 题目分析 代码 ==Problem B&C 五一假期前最后一题&女神的考验== 题目描述 ...

  3. 集合划分讲解-And-2021年ACM竞赛班训练(九)2021.5.20-问题 E: 登上火星-题解

    集合划分 集合划分,把 n n n个数分成 k k k个集合,不能包含空集,所有的划分数量记为斯大林数,用 S ( n , k ) S(n,k) S(n,k)表示. 目前斯大林数没有直接的公式,但是有 ...

  4. 2021年ACM竞赛班训练(十一)2021.5.20-问题 E: 调皮的摩尔-题解

    传送门 Balloon 题目描述 输入描述 输出描述 样例一 输入 输出 说明 提示 题目分析 注意事项 AC代码 Balloon 传送门 时间限制:1秒 空间限制:128M 题目描述 儿童节突然火起 ...

  5. BUCT-2021年ACM竞赛班训练(六)2021.4.29-问题 C:女神的考验-题解

    传送门 女神的考验 题目描述 输入描述 输出描述 样例一 输入 输出 题目分析 注意事项 AC代码 女神的考验 传送门 时间限制:1秒 空间限制:128M 题目描述 星空点点,墨日曜淡.世界芳华灼灼, ...

  6. BUCT-2021年ACM竞赛班训练(一)2021.3.25-问题 A: 大佬的高级IDLE-题解

    目录 大佬的高级IDLE 题目描述 输入描述 输出描述 示例1 输入 输出 说明 题目分析 解题思路 并查集离散化 AC代码 大佬的高级IDLE 传送门 时间限制:2秒 空间限制:128M 题目描述 ...

  7. CSDN 编程竞赛二十九期题解

    竞赛总览 CSDN 编程竞赛二十九期:比赛详情 (csdn.net) 竞赛题解 题目1.订班服 小A班级订班服了!可是小A是个小糊涂鬼,整错了好多人的衣服的大小.小A只能自己掏钱包来补钱了.小A想知道 ...

  8. 牛客竞赛数学专题班生成函数I 题解

    牛客竞赛数学专题班生成函数I 题解 题单链接 背包 题目链接 题意 总共有888个物品,对于每个物品的选法都有要求,问带nnn个物品的方案数. 思路 构造生成函数,并将等比级数转为合式(∏i=0xi= ...

  9. ACM如何入门,ACM竞赛需要学习哪些算法?

    #################成绩################## 大一:2017年4月份"玲珑杯"河南工业大学2017年ACM程序设计大赛暨河南高校邀请赛,获得银奖 20 ...

最新文章

  1. react.js做小程序_如何使用React.js构建现代的聊天应用程序
  2. EIGRP协议邻居详解及故障实战分析
  3. PHP查看PECL模块包含的函数
  4. 什么时候需要任务调度?
  5. 牛客网【每日一题】7月29日题目精讲—Max Power
  6. 初创公司5大Java服务困局,阿里工程师如何打破?
  7. 学英语(4)---出门在外常用的英语句子
  8. Jsp 【项目路径】
  9. python和go哪个就业前景好_Python和Java就业前景对比
  10. 框架 go_Go语言优秀应用开发框架 GoFrame
  11. mysql物业管理系统设计_小区物业管理系统的设计与实现(IDEA,SSM,MySQL)
  12. 图表控件MsChart使用demo
  13. 2019年电子设计国赛综合测评回顾
  14. Unity3D FingerGestures 手势插件使用
  15. android软件多版本共存,1. android studio 多版本共存(2.2 and 3.3)
  16. 成吉思汗陵举行戊戌年成吉思汗嗣火祭祀
  17. BERT |(3)BERT模型的使用--pytorch的代码解释
  18. ES6 语法之 Set 与 Map 数据结构
  19. LAMP 技术简介(3)
  20. 栈(stack)——什么是栈?

热门文章

  1. 四川泸州市高职计算机学校,四川泸州职高学校有哪些?
  2. 智慧商圈支付宝小程序(ISV系统服务商开发模式)
  3. Intel IPP库概述,合计共5000个函数
  4. 电脑C盘空间不足,突然变红,请检查AppData\Roaming
  5. 06年及以前韩国星际职业联赛及选手资料
  6. cmd 批量命名,批量删除
  7. 转载:在阿里工作四个月经历的总结
  8. 深度调查:危险的“360安全卫士”!
  9. android一键清理任务,Android 一键清理、内存清理功能实现
  10. 大数据与云计算网课答案