0
点赞
收藏
分享

微信扫一扫

蓝桥杯冲刺第八天

kolibreath 2022-03-15 阅读 78

目录

第一题、神奇算式

第二题、缩位求和

第三题、积木比赛


第一题、神奇算式

题目描述

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

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

比如:

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

都符合要求。

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

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
#include<iostream>
#include<algorithm> 
#include<cstring>
using namespace std;
int main()
{
	//先看i*j是否有4位,如果有四位,然后再看i和j加起来是否有四位,如果有再判断它们四位是否相等 
	//i*j的答案只能有一个,因此只要判断答案是否时第一次出现就可以解决题目所有的同一种情况问题。 
	int a[10];
	int b[10];
	int sum=0;
	int cnt[10000];
	memset(cnt,0,sizeof cnt);
	for(int i=1;i<1000;i++)
	{
		for(int j=1;j<1000;j++)
		{
			int ans=i*j;
			int t=ans;
			int k=0;
			while(t)
			{
				int temp=t%10;
				t=t/10;
				b[k++]=temp;
			}
			if(k==4)
			{
				int w=i,ww=j,q=0;
				while(w)
				{
					int temp=w%10;
					w=w/10;
					a[q++]=temp;
				}
				while(ww)
				{
					int temp=ww%10;
					ww=ww/10;
					a[q++]=temp;
				}
				if(q==4)
				{
                    //排序是为了更方便比较
					sort(a,a+q);
					sort(b,b+q);
					int flag=1;
					for(int s=0;s<q;s++)
					{
						if(a[s]!=b[s])
						{
							flag=0;
							break;
						}
					}
					if(flag==1)
					{
						if(cnt[ans]==0)
						{
							sum++;	
							cnt[ans]++;
							//cout<<i<<" "<<j<<" "<<ans<<endl;
						}
					}
				}
			}
		}
	}
	cout<<sum<<endl;
	return 0;
} 

第二题、缩位求和

题目描述

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

比如:248 \times 15 = 3720248×15=3720

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

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

1 + 5 = 61+5=6;

5 \times 65×6

而结果逐位求和为 3。

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

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

输入描述

输入描述

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

输出描述

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

输入输出样例

示例

35379

9

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M
#include<iostream>
using namespace std;
int dfs(int sum)
{
    int  ans=0;
    while(sum)
    {
        ans+=sum%10;
        sum=sum/10;
    }
    return ans;
}
int main()
{
    string s;
    int a[10010],sum=0;
    cin>>s;
    for(long long i=0;i<s.length();i++)
    {
        a[i]=(s[i]-'0');
        sum+=a[i];
    }
    //cout<<sum<<endl;
    int ans=0;
    ans=dfs(sum);
    while(ans>=10)
    {
        ans=dfs(ans);
    }
    cout<<ans<<endl; 
    return 0;
}

第三题、积木比赛

题目描述

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

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

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

输入描述

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

第二行包含 nn 个整数,第 ii 个整数为 h_ihi​。

保证 1 \leq n \leq 10^5,0 \leq hi \leq 10^41≤n≤105,0≤hi≤104。

输出描述

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

输入输出样例

示例

5
2 3 4 1 2

5

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
#include <iostream>
using namespace std;
int main()
{
	//贪心, 每次比较两个,如果第二个比第一个大,那么要一样高,第一个就必须加上
	//第二个减去第一个的差值才能一样高 
  int n;
  cin>>n;
  int a[100010];
  for(int i=1;i<=n;i++)
  {
  	cin>>a[i];
  } 
  int sum=0;
  //这里特别注意一下,a[1]相当于第一个要和还没堆的时候比较 
  for(int i=1;i<=n;i++)
  {
  	if(a[i]>a[i-1])
  	{
  		sum+=(a[i]-a[i-1]);
  	}
  }
  cout<<sum<<endl;
  return 0;
}
举报

相关推荐

0 条评论