天天看點

BK測開筆試——四道程式設計

2020.08.11

四道程式設計題,做出來了一道半

文章目錄

        • 一、回文串構造
        • 二、方格染色
        • 三、數字拆分
        • 四、矩陣取數

一、回文串構造

BK測開筆試——四道程式設計
  • 分析

    定義兩個指針分别從字元串首尾向中間周遊,碰到兩指針值不一樣的情況就将統計值+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;
    
}
           

二、方格染色

BK測開筆試——四道程式設計
  • 分析
  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;
}
           

三、數字拆分

BK測開筆試——四道程式設計
  • 分析:
n k 數字和
1 1 1
2 2 1+1
3 2 1+2
4 3 1+2+1
5 3 1+2+2
6 3 1+2+3
7 4 1+2+3+1
8 4 1+2+3+2
9 4 1+2+3+3
10 4 1+2+3+4

由以上規律可得,每n要都滿足題目所要求的條件,都必須從1開始加和,一直到能得到該值為止,并且每次相加到最後一位時都從1開始相加,比如

6=1+2+3

7=1+2+3+1

。畫個圖比較好了解:總之就是不斷網後加數所加的數每次都是從1開始,是以在統計k的值時,隻需要統計從1開始相加,每加一次k值相應加一次,直到相加的數大于等于n為止,傳回k值。

BK測開筆試——四道程式設計
  • 代碼:
#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;
	
}
           

四、矩陣取數

BK測開筆試——四道程式設計

輸入例子:

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;
}
           

繼續閱讀