算法竞赛入门【码蹄集进阶塔335题】(MT2296-2300)
文章目录
- 算法竞赛入门【码蹄集进阶塔335题】(MT2296-2300)
- 前言
- 为什么突然想学算法了?
- 为什么选择码蹄集作为刷题软件?
- 目录
- 1. MT2296 找朋友
- 2. MT2297 盒子与球
- 3. MT2298 点餐
- 4. MT2299 圣诞节送花
- 5. MT2300 枚举方案
- 结语
前言
为什么突然想学算法了?
> 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。
> 但从实际而言,是因为当下快到了考研和找工作的年纪(ಥ_ಥ),无论走哪一条路,都不免需要一些相对丰富的算法知识,是故,便产生了一个暑假速成算法的计划,可能对于像我这种算法竞赛小白而言,几乎很难,但我仍然还是想尝试一下,毕竟,梦想还是要有的,万一实现了呢?~( ̄▽ ̄~)~
为什么选择码蹄集作为刷题软件?
码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) 指导下建设的,其依托全国各大名校计算机系和清华大学出版社等单位的强大资源,旨在为计算机学习爱好者提供全面和权威的计算机习题。
目录
1. MT2296 找朋友
(1)题目描述
将Ⅳ个人分成M组,每组至少一人,在比赛结束时,同一组的人两两之间都会成为朋友,不同分组的分组方案得到的朋友对数不同。你的任务是求出最小和最大的朋友对数。
格式
输入格式: 两个整数n,m 。
.
输出格式: 两个整数表示答案。
样例1
输入格式: 5 1
.
输出格式: 10 10
备注:
提示:1≤m<n≤20
(2)参考代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
ios::sync_with_stdio(0);
int n,m;cin>>n>>m;
int ma=0,mi=0;
int t=n-(m-1);
ma=t*(t-1)/2;
t=n/m;
int tt=n%m;
mi=t*(t-1)/2*(m-tt);
mi+=t*(t+1)/2*tt;
cout<<mi<<' '<<ma<<endl;
return 0;
}
2. MT2297 盒子与球
(1)题目描述
现有r个互不相同的盒子和n个互不相同的球,要将这n个球放入r个盒子中,且不允许有空盒子。请求出有多少种不同的放法。
两种放法不同当且仅当存在一个球使得该球在两种放法中放入了不同的盒子。
格式
输入格式: 输入只有一行两个整数,分别代表n和r。
.
输出格式: 输出一行一个整数代表答案。
样例1
输入: 3 2
.
输出: 6
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int dp[20][20];
int main( )
{
int n,r;
cin>>n>>r;
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=r;j++){
if(i<j) break;
dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*j;
}
}
int ans=dp[n][r];
for(int i=1;i<=r;i++) ans*=i;
cout<<ans<<endl;
return 0;
}
3. MT2298 点餐
(1)题目描述
小码哥和他的两个朋友一起去吃饭,他们决定每个人先从菜单上选几道菜,然后点三个人都选中的菜。假设菜单中有n道菜,他们三人分别点了 a,b,c道菜,小码哥想知道是否有可能不存在三个人都选中的菜。
格式
输入格式:
一行,4个以空格隔开的正整数n, a,b,c 满足0<a,b,c ≤ n≤1000。
.
输出格式: 一行,若可能不存在三个人都选中的菜输出YEs,否则输出NO
样例1
输入格式: 5 3 4 4
.
输出格式: NO
(2)参考代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, a, b, c;
cin >> n >> a >> b >> c;
if(a + b + c > 2 * n)
cout << "NO" << endl;
else
cout << "YES" << endl;
}
4. MT2299 圣诞节送花
(1)题目描述
今天是圣诞节,小码哥拿着5束花就想要去送给他的朋友们表示祝福,但后来他才发现远远不够,于是决定在花店买一些花。
当小码哥遇到一家花店时,他会买下和自己手中数量一样的花,当遇到朋友时,则会送出2束。
现在知道了他外出遇到了m个花店和n个朋友,并且遇完所有花店和朋友后,花也正好送完,你能根据m和n计算出有多少种合适的次序吗(合适的次序表示小码哥遇到朋友时总是有花可以送,且遇到了m家花店和n个朋友,且回到家后手里不剩花)?
格式
输入格式:
第一行两个数: m和 n分别表示遇到花店、朋友的数量(1≤n, m ≤15)。
.
输出格式: 输出一个整数代表合适的次序的数量。
样例1:
输入:4 9
.
输出:8
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int m,n;
int dfs(int num,int M,int N){
if(num<0 || N>n || M>m || (N==n&&M!=m)) return 0;
if(M==m&&N==n&&num==0) return 1;
return dfs(num*2,M+1,N)+dfs(num-2,M,N+1);
}
int main( )
{
cin>>m>>n;
int ans=dfs(5,0,0);
cout<<ans<<endl;
return 0;
}
5. MT2300 枚举方案
(1)题目描述
从1到n这n个整数中随机选出m 个,输出所有可能的选择方案。
格式
输入格式: 两个整数n,m 。
.
输出格式: 输出每一种可能的方案,一行输出一种,按字典序输出。
样例1
输入格式: 5 3
.
输出格式:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
备注:
提示:1≤m<n≤20
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int ar[30], hash_[30], vis[30];
int n, m;
void dfs(int i, int num)
{
if (m == num)
{
for (int i = 1; i <= n; i++)
{
if (hash_[i] == 1)
{
cout << i << " ";
}
}
cout << endl;
return;
}
if (i == n + 1) return;
hash_[i] = 1;
dfs(i + 1, num + 1);
hash_[i] = 0;
dfs(i + 1, num);
}
int main( )
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
ar[i] = i;
}
dfs(1, 0);
return 0;
}
结语
感谢大家一直以来的不断支持与鼓励,码题集题库中的进阶塔350题正在逐步更新,之后会逐步跟进星耀,王者的题,尽请期待!!!
同时,也希望这些题能帮助到大家,一起进步,祝愿每一个算法道路上的“苦行僧”们,都能够历经磨难,终成正果,既然选择了这条路,走到了这里,中途放弃,岂不是太过可惜?
另附中国计算机学会的杰出会员、常务理事轩哥博士的B站视频讲解链接https://space.bilibili.com/518554541/?spm_id_from=333.999.0.0,供大家更好的进行学习与刷题~( ̄▽ ̄~)~
愿你的结局,配得上你一路的颠沛流离。