BK测开笔试——四道编程

2020.08.11
四道编程题,做出来了一道半

一、回文串构造

在这里插入图片描述

  • 分析
    定义两个指针分别从字符串首尾向中间遍历,碰到两指针值不一样的情况就将统计值+1。
  • 代码
#include<iostream>
#include<string>
using namespace std;

int CountNum(int len, string str)
{
    int x=0,y=len-1;
    int count = 0;
    for(int i=0;i<len/2;i++)
    {
        if(str[x] != str[y])
        {
            count++;
        }
        str[x++];
        str[y--];
        
    }
    return count;
}

int main()
{
    int len;
    string str;
    cin>>len;
    cin>>str;
    int n = CountNum(len, str);
    
    cout<<n;

	return 0;
    
}
二、方格染色

在这里插入图片描述

  • 分析
  1. 做题时候的思路:要是m或n里有2的倍数,结果就是是2;要是m和n都为3的倍数,就输出3;其他情况就输出m*n,只通过了10%。
  2. 后来从知道这道题实际上是让求m*n的公因子(除了1外)。
  • 代码:
#include<iostream>
#include<vector>
using namespace std;

//其实就是找最小公因数
int main()
{
    int t;
    cin>>t;
	int m = t;
    int n=2;
	vector<vector<int>> a(m);
	for(int i=0;i<m;i++) 
	{
		a[i].resize(n);
    }
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>a[i][j];
        }
    }
    
    for(int i=0;i<m;i++)
    {
		int x = a[i][0], y = a[i][1];

		if(x*y ==1)//1是特殊情况特殊处理
		{
			cout<<1<<endl;
		}
		else//否则找到m*n的最小因子输出
		{
			int i;
			int z = x*y;
			for(i=2;i<z;i++)
			{
				if(x*y%i==0)
					break;
			}
			cout<<i<<endl;
			continue;
		}
    }
	
    return 0;
}
三、数字拆分

在这里插入图片描述

  • 分析:
nk数字和
111
221+1
321+2
431+2+1
531+2+2
631+2+3
741+2+3+1
841+2+3+2
941+2+3+3
1041+2+3+4

由以上规律可得,每n要都满足题目所要求的条件,都必须从1开始加和,一直到能得到该值为止,并且每次相加到最后一位时都从1开始相加,比如6=1+2+37=1+2+3+1。画个图比较好理解:总之就是不断网后加数所加的数每次都是从1开始,所以在统计k的值时,只需要统计从1开始相加,每加一次k值相应加一次,直到相加的数大于等于n为止,返回k值。
在这里插入图片描述

  • 代码:
#include<iostream>
using namespace std;

int DivideNum(int t, int n)
{
	if(t<1 || n==NULL)
	return -1;
	int k=0;
	int sum=0;
	for(int i=1;i<n;i++)
	{
		sum+=i;
		k++;
		if(sum>=n)
		{
			return k;
		}
	}
	
}

int main()
{
	int t=10;
	int num[10]={1,2,3,4,5,6,7,8,9,10};
	for(int i=0;i<t;i++)
	{
		int r = DivideNum(t, num[i]);
		cout<<r<<endl;
	}
	

	return 0;
	
}
四、矩阵取数

在这里插入图片描述
输入例子:
2 2 2 2
2 3
3 3
输出例子:
11

  • 分析:
  1. 这道题在做的时候是完全看不懂题的状态,没有搞懂这写数减去d的这些数指的是什么,一直以为是用最终的sum去减。
  2. 之后才发现题目:

每次操作可以选择一行或者一列将其中的元素的值全部累加到sum中,然后把这些数都减去d,求sum的最大值

中的这些数指的就是让sum加和最大的行和或列和所在的行或列的元素,实在绕口。

  1. 其实就是找到每行或每列中的最大行和或列和,然后将所在的行或列中的元素全部减去d;
    然后重复k次上述操作;
    最后输出sum即可。
  • 代码
#include<iostream>
#include<vector>
using namespace std;

int FindMatrixMaxSum(int m, int n, int k, int d, vector<vector<int>> a)
{
	int sum=0;
	
	while(k>0)
	{
		int colSum=0, maxColSum=0, rowSum=0, maxRowSum=0,max=0;
		int maxRowSumIndex=0, maxColSumIndex=0;

		//找行和最大值
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				rowSum += a[i][j];
			}

			if(rowSum>maxRowSum)
			{
				maxRowSum = rowSum;
				maxRowSumIndex = i;
			}
			rowSum=0;
		}

		//找列和最大值
		for(int j=0;j<n;j++)
		{
			for(int i=0;i<m;i++)
			{
				colSum += a[i][j];
			}
			if(colSum>maxColSum)
			{
				maxColSum = colSum;
				maxColSumIndex = j;
			}
			colSum=0;
		}
		//找到最大值然后累加,并让最大值所在的行或列全部减去d值
		if(maxRowSum >= maxColSum)
		{
			sum += maxRowSum;
			for(int j=0;j<n;j++)
			{
				a[maxRowSumIndex][j] -= d;
			}
		}
		else
		{
			sum += maxColSum;
			for(int i=0;i<m;i++)
			{
				a[i][maxColSumIndex] -= d;
			}
		}
		k = k-1;
	}
	return sum;
	

}

int main()
{
	int m,n,k,d;
	cin>>m>>n>>k>>d;

	vector<vector<int>> a(m);
	for(int i=0;i<m;i++)
	{
		a[i].resize(n);
	}
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			cin>>a[i][j];
		}
	}


	int r = FindMatrixMaxSum(m,n,k,d,a);

	cout<<r;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值