蓝桥冲刺31天打卡—Day8

目录

1、神奇算式

题目描述

思路:

代码 

 2、缩位求和

题目描述

思路 

代码 

 3、积木大赛

题目描述

思路

代码 


1、神奇算式

题目地址

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

由 4 个不同的数字,组成的一个乘法算式,它们的乘积仍然由这 4 个数字组成。

比如:

210 x 6 = 1260 
8 x 473 = 3784
27 x 81 = 2187 

都符合要求。

如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的 3 种情况,一共有多少种满足要求的算式。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

思路:

我是用暴力枚举四个数再进行判重和去除满足乘法交换律的情况

看到别的大佬写可以用两个for。因为结果是4位数,所以一定只有十位数和十位数相乘或者百位数和个位数相乘两种情况,只需要枚举1~999之间满足题目条件的数即可。

代码 

#include
using namespace std;
int main()
{
	int i,j,sum,k;
	int cnt=0;
	string s1,s2,s3;
	for(i=1; i<=999; i++) 
	{
		for(j=1; j<=999; j++)
		{
			sum=i*j;
			if(sum>=1000&&sum<=9999&&i

 2、缩位求和

题目地址

题目描述

在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。

比如:248 x15 = 372

把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是 1 位数,得

2 + 4 + 8 = 14 ==> 1 + 4 = 5

1 + 5 = 6

5×6

而结果逐位求和为 3。

5×6 的结果逐位求和与 3 符合,说明正确的可能性很大!!(不能排除错误)

请你写一个计算机程序,对给定的字符串逐位求和。

输入描述

输入描述

输入为一个由数字组成的串,表示 n (n<1000) 位数;

输出描述

输出为一位数,表示反复逐位求和的结果。

输入

35379

输出 

9

思路 

每次将数字每位数相加放入sum中再转换为字符串放入s,最后判断字符串s的长度是否为1来退出循环。

 将字符串每位转换为数字累加:

for (int i = 0; i < s.size(); i++) {
			sum += s[i] - '0'; 
}

代码 

#include
using namespace std;
typedef long long ll;
string s;
int sum;

int main() {
	cin >> s;
	while (s.size() != 1) {
		sum = 0;
		for (int i = 0; i < s.size(); i++) {
			sum += s[i] - '0'; //将字符串每位转换为数字累加
		}
		s = to_string(sum); //将结果sum放入s中进行下一轮
	}
	cout << sum;
	return 0;
}

 3、积木大赛

题目地址

题目描述

春春幼儿园举办了一年一度的"积木大赛"。今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为 1 的积木组成,第 i 块积木的最终高度需要是hi​ 。

在搭建开始之前,没有任何积木(可以看成 n 块高度为 0 的积木)。接下来每次操作,小朋友们可以选择一段连续区间 [L,R],然后将第 LL 块到第 R 块之间(含第 L 块和第 R 块)所有积木的高度分别增加 1。

小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。

输入描述

输入包含两行,第一行包含一个整数 n ,表示大厦的宽度。

第二行包含 n 个整数,第 i 个整数为 hi。

保证 1<=n<=10^5,0<=hi<=10^4

输出描述

输出仅一行,即建造所需的最少操作数。

输入

5

2 3 4 1 2

输出 

思路

逆向思考将题目转换为:假设已知了每块积木的高度,每次可以将某一段区间中的所有高度减一,问最少操作多少次可以将所有高度变成0。

之后通过差分法计算,详细解法见此 文章地址

代码 

#include 
#include 
#include 
#include 
using namespace std;
const int N = 1e5 + 10 ;
int n;
int ans;
int a[N];//目标数组
int h[N];//积木高度初始数组
//int b[N];//差分数组
/*void insert(int l, int r, int c) {//将l~r所有数加c
	b[l] += c;
	b[r + 1] -= c;
}*/
int main() {
	cin >> n;
	memset(h,0,sizeof(h));
	for (int i = 1; i <= n; i++){
		cin>>h[i];
		a[i]=h[i]-h[i-1];
		if(h[i]>0)ans+=h[i];
	}
	//for (int i = 1; i <= n; i ++ ) insert(i, i, h[i]);
	cout<

 能力有限,今天的题还是没完全做对,参考了别人的题解

你可能感兴趣的:(蓝桥杯,算法,蓝桥杯,算法,c++)