算法竞赛入门【码蹄集进阶塔335题】(MT2026-2050)
文章目录
- 算法竞赛入门【码蹄集进阶塔335题】(MT2026-2050)
- 前言
- 目录
-
- 1. MT2026 二维坐标点移动
- 2. MT2027 一秒成零
- 3. MT2028 小码哥的计划表
- 4. MT2029 小码哥的跳棋游戏
- 5. MT2030 邮箱地址
- 6. MT2031 排队
- 7. MT2032 小码哥与机器人
- 8. MT2033 碰碰车
- 9. MT2034 竖直打印机
- 10. MT2035 伯兰语
- 11. MT2036 移水造海
- 12. MT2037 奇怪的和
- 13. MT2038 字符矩阵
- 14. MT2039 换换换
- 15. MT2040 银行账户
- 16. MT2041 三角形的个数
- 17. MT2042 硬币塔
- 18. MT2043 数字问题
- 19. MT2044 字符串的解码
- 20. MT2045 河内双塔(已删去)
- 20. MT2045 斐波那契,但是是字符串
- 21. MT2046 巨大的错误
- 22. MT2047 距离平方和
- 23. MT2048 三连
- 24. MT2049 运动会进行中
- 25. MT2050 矩阵01变
- 结语
前言

为什么突然想学算法了?
> 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。
> 但从实际而言,是因为当下快到了考研和找工作的年纪(ಥ_ಥ),无论走哪一条路,都不免需要一些相对丰富的算法知识,是故,便产生了一个暑假速成算法的计划,可能对于像我这种算法竞赛小白而言,几乎很难,但我仍然还是想尝试一下,毕竟,梦想还是要有的,万一实现了呢?~( ̄▽ ̄~)~

为什么选择码蹄集作为刷题软件?
码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) 指导下建设的,其依托全国各大名校计算机系和清华大学出版社等单位的强大资源,旨在为计算机学习爱好者提供全面和权威的计算机习题。
目录
1. MT2026 二维坐标点移动
(1)题目描述
给定一个N* M的二维坐标矩阵A,并且给定一个整数K,K表示移动步数,矩阵A中的所有点A[][j]的移动操作如下:
1.A[i][j]移动到A[i][j+1](j≤m -2)
2.A[i][m -1]移动到A[i+1][0](i≤n -2)
3.A[n - 1][m-1]移动到A[0][0]
最后输出移动了K次后新的二维坐标矩阵A 。
格式
输入格式:
第一行两个整数N, M(N ,M ≤50)
接下来N行,每行M个数,即A[i][j](0<i<N,0≤j<M ,-1000 ≤A[i][j]≤1000)
最后一行一个整数K(0≤K ≤100)
.
输出格式: N行,每行M个数,即修改之后的A[][j](0<i<N,0≤j<M ,—1000 ≤ A[i][i]≤1000) .
样例1
输入:
3 3
1 2 3
30 40 50
10 20 30
2
.
输出:
20 30 1
2 3 30
40 50 10
备注:
其中: 1≤N ,M ≤50,-1000≤ A[i][i]≤1000,0≤K ≤1000
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,m;
cin>>n>>m;
deque<int> a(n*m);
for(int i=0;i<n*m;i++) cin>>a[i];
int k;
cin>>k;
k%=n*m;
for(int i=0;i<k;i++){
a.push_front(a.back());
a.pop_back();
}
for(int i=0;i<n*m;){
cout<<a[i]<<" ";
i+=1;
if(i%m==0) cout<<endl;
}
return 0;
}
2. MT2027 一秒成零
(1)题目描述
给定一个正整数n ,请写一个函数Steps ,将n通过以下操作变成0,并且返回操作次数。
n为偶数,则n =n/2 ;
n为奇数,则n =n- 1。
格式
输入格式: n为偶数,则n =n/2 ;n为奇数,则n =n- 1。
.
输出格式: 输出操作次数
样例1
输入: 14
.
输出: 6
(2)参考代码
class Solution(object):
def Steps(self,n):
res=0
while n>0:
if n%2==0:
n //= 2
else:
n -= 1
res += 1
return res
def main():
#code here
n = int(input())
S = Solution()
res = S.Steps(n)
print(res)
if __name__ == '__main__':
main();
3. MT2028 小码哥的计划表
(1)题目描述
小码哥的寒假有Ⅳ天,他做了一个计划表,计划每天做若干数分题目,但是为了平衡每天的任务量,小码哥决定调整一下他的计划表。他首先设定了每天做题数目的上限R和下限L,然后他准备做一些调整,使得每天的题目数量A;满足L≤A≤R。每次调整小码哥可以把某一天的某些题目换到另一天,每次操作只能移动一道题目。
小码哥请你帮忙算一算需要的最小操作数。
格式
输入格式:
第一行一个正整数N,表示计划表的总天数;
第二行Ⅳ个整数,表示计划表初始每天的题目数;
第三行两个整数L,R。
.
输出格式: 一个数,表示最小的操作数,如果不能满足题目条件输出-1。
样例1
输入:
2
10 20
10 15
.
输出: 5
备注:
1 ≤n ≤100000,1≤ Ai≤ 1000,1<L<R≤1000
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll i,j,k,n,m,l,r,a[100005],sb,r1,r2;
int main( )
{
cin>>n;
for(i=1;i<=n; i++){
cin>>a[i];sb+=a[i];}
cin>>l>>r;
for(i=1; i<=n;i++){
if(a[i]<l)r1+=l-a[i];
if(a[i]>r)r2+=a[i]-r;
}
if (sb<l*n||sb>r*n){
cout<<-1;}
else cout<<max(r1, r2);
return 0;
}
4. MT2029 小码哥的跳棋游戏
(1)题目描述
小码哥喜爱跳棋。跳棋游戏在一条直线上,一共n个位置( 1 ~ n ),每个位置有2个状态:0表示没有棋子,1表示有棋子。小码哥的棋子自然是能通过没有棋子的位置。当面前有1个棋子时,小码哥可以直接跳过。当有两个及以上棋子连在一起时,小码哥的棋子是跳不过去的。这时候,就要花费能量,破坏掉一些棋子,才能跳过。已知破坏一枚棋子需要花费一点能量。小码哥的棋子从第0个位置出发,现在要求小码哥到达终点(第n个位置)至少需要花费多少能量?
格式
输入格式:
第1行包含一个正整数n
第2行n个整数a ,表示棋盘的状态
.
输出格式: 一个整数,输出最小耗费的能量数
样例1:
输入:
5
0 1 1 0 0
.
输出:1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int a[100030];
int main( )
{
int n;cin>>n;
for(int i=0;i<n;i++)
scanf("%d", &a[i]);
int tmp=0,cnt=0,res=0;
if(a[n-1]) {
a[n-1]=0;res++;}
while(tmp<n){
while(tmp<n && a[tmp]){
cnt++; tmp++;
} res+=cnt/2;
cnt=0; tmp++;
} cout<<res;
return 0;
return 0;
}
5. MT2030 邮箱地址
(1)题目描述

格式
输入格式: 一行,一个字符串,表示一个地址(保证地址的字符的ASCIl在33到127间),地址长度不超过1000字符
.
输出格式: 一行,如果合法输出YES,否则输出NO
样例1
输入: 123@npu.com
.
输出: YES
(2)参考代码
#include<iostream>
#include<string>
using namespace std;
string s,u,h,r;
bool check(char ch){
if((ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch<='z' || ch >= '0' && ch <= '9' || ch == '_'))
return true;
else
return false;
}
bool username(){
int l = u.size();
if(l == 0 || l>16) return false;
for(int i=0;i<l;i++){
if(!check(u[i])) return false;
}
return true;
}
bool hostname(){
int l = h.size();
if(h[0] == '.' || l==0 || l>32 || h[l-1] == '.') return false;
for(int i=1;i<l-2;i++){
if(h[i]=='.' && h[i+1] == '.') return false;
}
int sum=0;
for(int i=0;i<l;i++){
if(h[i] != '.' && !check(h[i])) return false;
if(h[i] != '.') sum++;
else{
if(sum>16) return false;
sum = 0;
}
}
if(sum>16) return false;
return true;
}
bool resource(){
int l = r.size();
if(l == 0) return false;
for(int i=0;i<l;i++) {
if(!check(r[i])) return false;
}
return true;
}
int main(){
int p1,p2;
cin>>s;
p1 = s.find('@'),p2=s.find('/');
if(p1==string::npos){
cout<<"NO";
return 0;
}
u = s.substr(0,p1);
if(p2 == string::npos) h = s.substr(p1+1);
else h = s.substr(p1+1,p2-(p1+1));
if(p2!=string::npos){
r = s.substr(p2+1);
if(!resource()){
cout<<"NO";
return 0;
}
}
if(username() && hostname()) cout

最低0.47元/天 解锁文章
942

被折叠的 条评论
为什么被折叠?



