算法day04

72 阅读2分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」。

本文不介绍C++和Java基本语法,想要学习请点击下方链接

菜鸟教程 C++

菜鸟教程 Java


今天讲解三道题,这三道题必须仔细分析题目,这样会简化很多工作量

题解

1. Theatre Square

用 a×a的石板覆盖 n×m 的长方形广场,允许石板覆盖的区域超出广场,不允许打破石板,石板的两侧应平行于广场两侧,要求覆盖完广场所需的石板数量最少是多少。

#include<iostream>
//本题主要在于数学思路,不在于代码
//本题可以将长,宽分别来看,然后在相乘
using namespace std;
int main()
{
    int a,b,c;//n,m,a
    cin>>a>>b>>c;
    int q,w;//将长和宽分开看后可以分成两种,一种是可以整除的,一种是不可以整除的,不可以整除后必须加一,因为石板必须完整
    if (a%c==0)q=a/c;
    else q=a/c+1;//q用来接收长的值,w用来接收宽的值
    if (b%c==0)w=b/c;
    else w=b/c+1;
    cout<<q*w<<endl;
    return 0;
}
#include <iostream>//可以将上诉代码简化一下,将长或者宽的两种情况简化为以下代码:
using namespace std;
typedef long long LL;
int main()
{
	int a, b, c;
	cin >> a >> b >> c;
	LL s1 = (a + c - 1) / c;//将两种情况合并了一下,是否整除整除结果都是1
	LL s2 = (b + c - 1) / c;
	cout << s1 * s2 << endl;
	return 0; 
}

2.选数

已知 n个整数x1……xn,以及 1 个整数 k(k<n)。从 n 个整数中任选 k个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:

3+7+12=22

3+7+19=29

7+12+19=38

3+12+19=34

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=29。

//首先判断质数应该是不需要讲解的,最主要的就是排列组合
#include <iostream>
using namespace std;
const int N = 25;//定义为全局变量会默认有一个初值
int w[N];
int n, k;//k是选数的个数
int res;//记录符合条件的数有几个
bool is_prime(int x)//该函数用来判断质数
{
	for (int i = 2; i <= x / i; i ++ )
	{
		if (x % i == 0) return false;
	}
	return true;
}
void dfs(int u, int t, int sum)
{
	if (u == k)//如果选了足够数量的数,进行判断和是否为质数,是的话进行记录res ++
	{
		if (is_prime(sum)) res ++ ;
		return ;
	}
	for (int i = t; i < n; i ++ )
	{
		dfs(u + 1, i + 1, sum + w[i]);//使用递归的思想,将所有情况一一找到
	}
}
int main()
{
	cin >> n >> k;
	for (int i = 0; i < n; i ++ ) cin >> w[i];
	dfs(0, 0, 0);//传的值为0,从0开始遍历
	cout << res << endl;
	return 0;
}

3.umi的函数

接受两个字符串 s1,s2。这些字符串只能由小写字母组成,并且具有相同的长度。这个函数的输出是另一个长度与 s1,s2 相同的字符串 g。g 的第 i 个字符等于 s1 的第i 个字符和 s2 的第 i 个字符的最小值,简单来说,g[i]=min(s1[i],s2[i])。

例如:f("ab","ba")= "aa", f("nzwzl","zizez")="niwel".

她现在有两个相同长度的只有小写字母的字符串 x,y。找出任何一个满足 f(x,z)=y 的

字符串 z。如果找不到这样的字符串的话,请输出-1。

#include <iostream>
//本提最重要的一点就是一定要看清题,读懂题,我就看错了一次
//分析题意可知,要已知一个字符串和结果求另一个字符串
//本题分析后可以知道,分为两种情况,当字符串s1的第i个字符小于结果的第i个字符时,这种情况一旦发生,结果必然是-1,另一种,我们需要思考一下,如果一定存在的话,那结果本身就可以当成是另一个字符串,所以直接输出结果。
using namespace std;
int n;
string s1, s2;
int main()
{
	cin >> n >> s1 >> s2;
	for (int i = 0; i < n; i ++ )
	{
		if (s1[i] < s2[i])
		{
			puts("-1");	
			return 0;
		}
	}
	cout << s2 << endl;
	return 0;
}