一、算式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<<"("< } } } for(int i=0;i { if(!b[i]) { a[x] = i; b[i] = 1; dfs(x+1); b[i] = 0; } } } int main() { dfs(0); return 0; }
二、谈判(贪心)
题目链接:谈判 - 蓝桥云课 (lanqiao.cn)
题目要求:
在很久很久以前,有 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; }
三、幸运数(模拟)
题目链接:幸运数 - 蓝桥云课 (lanqiao.cn)
题目要求:
幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的"筛法"生成。
首先从 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] { sum++; } } cout<<sum; return 0; }
四、123(前缀和)
题目链接:123 - 蓝桥云课 (lanqiao.cn)
题目要求:
小蓝发现了一个有趣的数列,这个数列的前几项如下:
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 { if(d { a[i]=d; d++; } else { i--; d=1; k++; } } w[1]=a[1]; for(int i=2;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 { cout<<c[i]<<endl; } return 0; }