大家好我是泡泡,今天继续给大家带来题解
目录
一丶算式900(dfs)
题目链接:算式900 - 蓝桥云课 (lanqiao.cn)
题目要求:
小明的作业本上有道思考题:
看下面的算式:
(□□□□-□□□□)*□□=900
其中的小方块代表 00 ~ 9 的数字,这 10 个方块刚好包含了 0 ~ 9 中的所有数字。 注意:0 不能作为某个数字的首位。
小明经过几天的努力,终于做出了答案!如下:
(5012-4987)*36=900
用计算机搜索后,发现还有另外一个解,本题的任务就是:请你算出这另外的一个解。
注意:输出格式需要与示例严格一致; 括号及运算符号不要用中文输入法; 整个算式中不能包含空格。
解题思路:
先全排列出九个数字,然后判断首位是否为0或五,如果不是就把数组里边前四个 后四个 最后两个取出来判断就好啦。
#include<bits/stdc++.h>
using namespace std;
int n = 10;
int a[1010],b[1010];
int sum,num,z;
void dfs(int x)
{
if(x>9)
{
if(a[0]==0||a[4]==0||a[8]==0||a[0]==5)
{
return ;
}
else
{
sum=a[0]*1000+a[1]*100+a[2]*10+a[3];
num=a[4]*1000+a[5]*100+a[6]*10+a[7];
z=a[8]*10+a[9];
if((sum-num)*z==900)
{
cout<<"("<<sum<<"-"<<num<<")"<<"*"<<z<<"="<<"900";
}
}
}
for(int i=0;i<n;i++)
{
if(!b[i])
{
a[x] = i;
b[i] = 1;
dfs(x+1);
b[i] = 0;
}
}
}
int main()
{
dfs(0);
return 0;
}
二丶谈判(贪心)
题目要求:
在很久很久以前,有 n 个部落居住在平原上,依次编号为 1 到 n。第 i 个部落的人数为 ti。
有一年发生了灾荒。年轻的政治家小蓝想要说服所有部落一同应对灾荒,他能通过谈判来说服部落进行联合。
每次谈判,小蓝只能邀请两个部落参加,花费的金币数量为两个部落的人数之和,谈判的效果是两个部落联合成一个部落(人数为原来两个部落的人数之和)。
解题思路:
用排序把数组从小到大排序,每次让最小的两个相加即可。
#include<bits/stdc++.h>
using namespace std;
int a[10010];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int sum = 0;
sort(a+1,a+1+n);
int num = a[1];
for(int i=2;i<=n;i++)
{
num = a[i] + num;
sum += num;
}
cout<<sum;
return 0;
}
三丶幸运数(模拟)
题目要求:
幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的"筛法"生成。
首先从 1 开始写出自然数 1,2,3,4,5,6,⋯
1 就是第一个幸运数。
我们从 2 这个数开始。把所有序号能被 2 整除的项删除,变为:
1 3 5 7 9⋯
把它们缩紧,重新记序,为:
1 3 5 7 9⋯
这时,3 为第 2个幸运数,然后把所有能被 3 整除的序号位置的数删去。注意,是序号位置,不是那个数本身能否被 33 整除!删除的应该是 5,11,17,⋯
此时 7 为第 3 个幸运数,然后再删去序号位置能被 7 整除的( 19,39,⋯)
最后剩下的序列类似:
1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79
解题思路:
模拟模拟模拟模拟 这题代码复杂但是题目不难
#include<bits/stdc++.h>
using namespace std;
int a[100010],b[100010];
int p=2,n,m,sum,nn,mm;
int main()
{
cin>>m>>n;
a[0]=-1;
for(int i=1;i<=n;i++)
{
a[i] = a[i-1]+2;
}
nn=n;
while(p+a[p]<=nn)
{
mm=1;
for(int i=1;i<=nn;i++)
{
if(i%a[p])
{
b[mm++] = a[i];
}
}
nn = mm - 1;
for(int i=1;i<=nn;i++)
{
a[i] = b[i];
}
p++;
}
for(int i=1;i<=nn;i++)
{
if(a[i]>m&&a[i]<n)
{
sum++;
}
}
cout<<sum;
return 0;
}
四丶123(前缀和)
题目要求:
小蓝发现了一个有趣的数列,这个数列的前几项如下:
1,1,2,1,2,3,1,2,3,4,⋯
小蓝发现,这个数列前 1 项是整数 1,接下来 2 项是整数 1 至 2,接下来 3 项是整数 1 至 3,接下来 4 项是整数 1 至 4,依次类推。
小蓝想知道,这个数列中,连续一段的和是多少。
解题思路:
前缀和和数组,这个数据太大爆的心态炸了,这个码能拿70-80分把估计
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e8+10;
int a[maxn],w[maxn],c[maxn];
int main()
{
int k=1,d=1;
for(int i=1;i<maxn;i++)
{
if(d<k)
{
a[i]=d;
d++;
}
else
{
i--;
d=1;
k++;
}
}
w[1]=a[1];
for(int i=2;i<maxn;i++)
{
w[i]=w[i-1]+a[i];
}
int t;
cin>>t;
int x,y;
int z = 0;
while(t--)
{
cin>>x>>y;
if(x==y)
{
c[z++] = a[x];
}
else
{
c[z++] = w[y]-w[x]+a[x];
}
}
for(int i=0;i<z;i++)
{
cout<<c[i]<<endl;
}
return 0;
}