算法竞赛入门【码蹄集进阶塔335题】(MT2026-2050)

算法竞赛入门【码蹄集进阶塔335题】(MT2026-2050)



前言

在这里插入图片描述

为什么突然想学算法了?

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

在这里插入图片描述


为什么选择码蹄集作为刷题软件?

码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ぃ灵彧が

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值