第一题:煤球数目
题目描述
有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),…
如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
题目分析
该题目是一个模拟题,首先找出他的规律
第一层:1
第二层:1+2
第三层:1+2+3
第四层:1+2+3+4
第100层:1+2+…+100
最终的要求是**求所有的煤球数** ,看清题意 很重要哦!
题目代码
#include<bits/stdc++.h> using namespace std; int main(){ int res = 0; int temp = 0; for(int i = 1;i <= 100; i++){ temp+=i;//temp:1 1+2 1+2+3 res += temp;// } cout<<res<<endl;//171700 return 0; }
题目答案
171700
第二题:生日蜡烛
题目描述
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?
请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
题目分析
暴力法,两层循环,第一层表示从多少岁过生日,第二层表示当前多少岁了。满足条件就跳出循环。
题目代码
#include<bits/stdc++.h> using namespace std; int main() { for(int i = 1;i <=100; i++){ int temp = i; for(int j = i+1; j<= 100;j++) { temp += j; if(temp==236){ cout<<i<<" "<<j<<endl;//26 33 }else if(temp > 236){ break; } } } return 0; }
题目答案
26
第三题:凑算式
题目描述
/* 凑算式 B DEF A + --- + ------- = 10 C GHI (如果显示有问题,可以参见【图1.jpg】) */
这个算式中A ~ I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。1
题目分析
暴力循环,直接用next_permutation() .直接写9层for循环也可,但是太low了.
**注意:**根据题目中的样例,可以看出,可以存在分数的加法运算. 所以我们计算时要转换成精度更高的float或者double .最后和10做差值的结果只要 <= 1e-5,则认为相等.
题目代码
#include<bits/stdc++.h> using namespace std; int nums[9] = {1,2,3,4,5,6,7,8,9};// A B C D E F G H I //全排列 int main() { int ans = 0; do { int A = nums[0],B = nums[1],C = nums[2],D = nums[3],E = nums[4],F = nums[5],G = nums[6],H = nums[7],I = nums[8]; double m = D*100.0 + E*10 + F; double n = G*100.0 + H*10 + I; if(fabs(A+B*1.0/C+m/n - 10) <=1e-5) { cout<<A<<" "<<B<<" "<<C<<" "<<m<<" "<<n<<endl; ans++; } } while(next_permutation(nums,nums+9)); cout<<ans<<endl;//29 return 0; } //abs:求整数的绝对值 fabs:求float或double的绝对值 //根据题目中的样例,可以看出,可以存在分数的加法运算. 所以我们计算时要转换成精度更高的float或者double .最后和10做差值的结果只要 <= 1e-5,则认为相等.
题目答案
29
第六题:方格填数
题目描述
如下的10个格子
+--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
题目分析
模拟+全排列+深搜
将数组放到一维数组中,然后进行全排列,将结果 转换成二维数组.然后判断该二维数组是否是一个可行的方案.
题目代码
#include<bits/stdc++.h> using namespace std; int nums[10] = {0,1,2,3,4,5,6,7,8,9},map1[4][5],total; int NEXT[8][2] = { -1,0,//上 1,0,//下 0,-1,//左 0,1,//右 -1,-1,//左上 1,1,//右下 -1,1,//右上 1,-1//左下 }; bool check(int x,int y) {//判断该位置 八个方向的数字是否和其相邻 //遍历该数的八个方向 int tx,ty; for(int i = 0; i < 8; i++) { tx = x+NEXT[i][0]; ty = y+NEXT[i][1]; if(tx<1 || tx >3 || ty < 1 || ty > 4){//越界 continue; } if(abs(map1[x][y]-map1[tx][ty])==1) { return false; } } return true; } void solve() { //判断当前填数方案是否成立 //将nums放入到map1中 0-9 int k = 0; for(int i = 1; i<=3; i++){ for(int j = 1; j<= 4; j++){ if((i==1&&j==1) || (i==3&&j==4)){//两个特殊位置初始化 map1[i][j] = 1000; continue; } map1[i][j] = nums[k++]; } } //判断每个位置是否符合,只要有一个不符合就结束 for(int i = 1;i <= 3; i++) { for(int j = 1;j <= 4; j++){ if(!check(i,j)){ return; } } } total++;//都符合,则方案数++ } int main() { do { solve(); } while(next_permutation(nums,nums+10));//有几个数就加几啊~~~ cout<<total<<endl; return 0; }
参考答案
1580