2021-11-07

|
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、第一次招新赛?

这一次招新赛知识点并不全面,主要时考验一个基础的代码和思维能力,下一周会把知识点完善

二、题解

1.蛇形矩阵(中等)

考察一个基础的规律发现和for循环的应用
代码如下(示例):

#include<stdio.h>
int i[35][35];
int main()
{
    int n;
    scanf("%d",&n);
    int cnt=1;
    for(int a=1;a<=n;a++)
    {
        for(int b=1;b<=n;b++)
        {
            if(a%2!=0)
                i[b][a]=cnt++;//按行输出a为行数不变,奇数行从上到下即b从1~n存下数字
            else
                i[n-b+1][a]=cnt++;//偶数行从下到上即b从n到1存下数字
        }
    }
    for(int a=1;a<=n;a++)
    {
        for(int b=1;b<=n;b++)
            printf("%d ",i[a][b]);//将结果输出
            printf("\n");
    }
    return 0;
}

2.Group QQ Speed(防AK)

因为怕你们陷入其中,所以英文劝退
如果所有人在同一组里,由于每个人都可能会禁掉不同的地图,因此我们应该有n + 1 n + 1n+1张地图;
如果每个人单独一组,则需要2张图;
其余情况下,只需要3张地图即可满足题意。

代码如下(示例):

#include <bits/stdc++.h>
#define itn int
#define ll long long
#define rnt register int
#define ull unsigned long long
#define IOF ios_base::sync_with_stdio(false)
#pragma GCC optimize("no-stack-protector")
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;

signed main(){
    IOF;
    int T = 0; cin >> T;
    while (T--){
        int n, m; cin >> n >> m;
        if (n == m) cout << 2 << endl;
        else if (m == 1) cout << n + 1 << endl;
        else cout << 3 << endl;
    }
}

3.对比(困难)

看题的时候就觉得写出这道的是前五,果不其然下😁!如果两个数的底数相同,比较起来就很容易。 我们的数字可以转换成一个公用的基数,只要用公式就可以了
在这里插入图片描述
一个简单的实现需要O(N + M)时间和内存。 注意,您需要64位整数! 和不使用 pow。

#include<stdio.h>
long long  n, m, x, y, res1, res2, k;

int main()
{
	scanf("%lld%lld", &n, &x);

	for (int i = 1; i <= n; i++)
	{
		scanf("%lld", &k);
		long long  p = n - i, l = 1;
		while (p--)
			l *= x;
		res1 += k * l;
	}

	scanf("%lld%lld", &m, &y);

	for (int i = 1; i <= m; i++)
	{
		scanf("%lld", &k);
		long long  p = m - i, l = 1;
		while (p--)
			l *= y;
		res2 += k * l;
	}


	if (res1 == res2)
		printf("=");
	else if (res1 > res2)
		printf(">");
	else
		printf("<");

	return 0;
}

4.数数字(困难)

这道题的要求是输出从 1 到 n 当中 所有出现的 数字1 的 个数;
这道题如果对于每一个测试样例都从 1 到 n 跑一遍,那么对于一共1e4组的数据,每组数据大小到1e6,则一定会超过题目规定的运行时间; 因此我们要降低我们的程序运行时间;
我们仔细思考程序的运行过程就会发现,对于两次测试数据n_1,n_2,如果我在第一次的数据从 1 跑到 n_1 时,第二次依然从 1 跑到 n_2,那么对于两次运行,我都重复跑了 1 到 n (n < n_1,n < n_2),
因此我们可以尝试处理从 1 到 一个比较大的数(对于这一题来说可以就处理到 1e6);

int ans[1000100];//存储从 1 到 n 中的每一个答案
    for (int i = 1; i <= 1000010; i++)
    {
        int t = i, res = 0;
        while (t)//求当前这个数有几个 1 
        {
            if (t % 10 == 1)
                res++;
            t /= 10;
        }
        ans[i] = ans[i - 1] + res;//当前的 i 的答案等于等于第 i - 1 的答案加上当前数的1的个数
    }

处理完之后我们在读入一个值,输出一个值就行了;
代码:

#include <stdio.h>
int ans[1000100];
int main()
{
    for (int i = 1; i <= 1000010; i++)
    {
        int t = i, res = 0;
        while (t)
        {
            if (t % 10 == 1)
                res++;
            t /= 10;
        }
        ans[i] = ans[i - 1] + res;
    }

    int a;
    while (~scanf("%d", &a))
    {
        printf("%d\n", ans[a]);
    }
    return 0;
}

5.国际象棋(中等)

发现了规律后就比较简单了

#include <stdio.h>
#include <algorithm>
using namespace std;

int t, l1, r1, l2, r2;

int main()
{
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d %d %d %d", &l1, &r1, &l2, &r2);
        if (l1 == l2 && r1 == r2) //特判相同位置
        {
            printf("0 0 0\n");
            continue;
        }

        //国王:只需看横纵坐标相差最大的,因为相差小的那个可以用斜来一起走(一步斜 = 直 + 横)
        printf("%d ", max(abs(l1 - l2), abs(r1 - r2)));

        //皇后
        if (l1 - r1 == l2 - r2 || l1 + r1 == l2 + r2 || l1 == l2 || r1 == r2)
            printf("1 "); //看能否能一步(直,横,斜)到
        else
            printf("2 ");

        //战车
        if (l1 == l2 || r1 == r2)
            printf("1\n"); //同上
        else
            printf("2\n");
    }
    return 0;
}

6.签个到(终极签到)

第一节课第一个强调的东西,遇见纯输出能复制就复制,代码就不给了,全过了。

7.Minimum Ternary String(防AK)

关键是把题意理解为:固定0、2的相对位置,往里随意放1,能得到的最小字典序。
显然,目标是把所有1放到0后1前好,故放到第一个2222前,若没有2则放到字符串最前。
关于存储串的形式,存到数组记1的数目即可,然后打印做处理即可。
给一个只含0、1、2串,只能做相邻的01交换或者相邻的12交换操作,问经过数次操作(可以是0次)能得到的最小字典序的串是什么。

#include<stdio.h>
#include<string.h>
char a[100005];
char b[100005];
int main(){
     scanf("%s",a);
    int cnt = 0;
    int m = strlen(a);
    int i;
    for (i=0;i<m;i++){
        if(a[i]=='1'){
            cnt++;
        }
    }
    int step = 0;
    int num = 0;
    for (i = 0; i < m; i++)
    {
        if(a[i]=='2'&&step==0){
            while(cnt--){
                b[num++] = '1';
            }
            b[num++] = a[i];
            step = 1;
        }
        else if(a[i]!='1'){
            b[num++] = a[i];
        }
    }
    printf("%s", b);
    if(step==0){
        while(cnt--){
            printf("1");
        }
    }
    return 0;
}

8.zhg学长到底加了多少学妹的wx(签到)

分别记录a和b的个数然后比较就好了

#include<stdio.h>
int main()
{
	int n,m,a,b;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		int m;
		scanf("%d",&m);//0为学妹,1为学弟
		if(m==1)
		a++;//当m等于1时,用a记录学弟个数
		else
		b++;//b记录学弟个数
	}
	if(a>b)//判断是学弟多还是学妹多
	printf("给zhg学长道歉Orz\n");
	else if(a<b)
	printf("zhg学长真是个渣男\n");
	else
	printf("真是错怪zhg学长了\n");
    return 0;
}

9.打倒BOSS(简单)

用总法力值除以技能法力值乘以技能伤害值看是否能打死boss可以就输出这个技能的编号

#include <stdio.h>
int main()
{
	int k, m, n;
	scanf("%d%d%d", &k, &m, &n);
	int t = 1;
	int flag = 0;
	while (m--)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		if (k / x * y >= n)//判断一下伤害能否高于boss血量 
		{
			printf("%d ", t);
			flag = 1;//有技能可以打死boss 
		}
		t++;
	}
	if (flag == 0)
		printf("-1\n");
	return 0;
}

10.zhg学长的心软(一)(简单)

题目比较长,但是挺好写的,一个小小的思维考察 也算半个签到题了 可能因为题面的原因 大部分人还是没有写 但是很简单 若想要不被打扰 每次后面一个用户关灯即是最优解

#include<stdio.h>
const int N=505;
int a[N];
int main() {
  int n,cnt=0;
  scanf("%d",&n);
  for(int i=1;i<=n;i++){
      scanf("%d",&a[i]);
  }
  for(int i=2;i<=n-1;i++){ //同样心软(二)一样的边界判断 
      if(a[i-1]==1&&a[i+1]==1&&a[i]==0)
          {
              cnt++;
              a[i+1]=0;
          }
  }
  printf("%d\n",cnt);
    return 0;
}

11.zhg学长的心软(二)(签到)

没什么好说的 按照题意写就行 注意一下for循环的边界判断

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d",&a[i]);
    }
    int cnt = 0;
    for (int i = 2; i <= n - 1; i++) //在这里需要进行for循环的一个边界判断,因为i-1和i+1的缘故,所以i需要从2开始,到n-1结束 
    {
        if (a[i] == (a[i - 1] + a[i + 1])/2)
            cnt++;
    }
    printf("%d\n",cnt);
    return 0;
}

12.逆序数.(签到)

双重for循环,外循环枚举第i个数,内循环从第i+1个数开始进行比较a[i]>a[i+1]则满足逆序对定义

#include<stdio.h>
int a[10005];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
    for(int i=1;i<n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(a[i]>a[j])
            printf("<%d,%d>\n",a[i],a[j]);
        }
    }
    return 0;
}

13.翻硬币(中等)

在这里插入图片描述

#include<stdio.h>
int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}
int main()
{
   int t;
   scanf("%d",&t);
   while(t--)
   {
	   int n,a,b;
	   scanf("%d %d %d",&n,&a,&b);
	   int ans=n-n/a-n/b+n/(a*b/gcd(a,b))*2;
	   printf("%d\n",ans);
   }

   return 0;
}

总结

这次的大家打的不好不要灰心,招新赛还有很多场,下次的比赛会更侧重知识点的全面,例如我们讲过的结构体,字符串等知识点,下次都会涉猎,大家抓紧复习吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值