早已立下flag,每日一更。所以我不能连第二天都没有坚持下来吧?
题目的逼格很高,意思是人理解迭代,神理解递归。这一天在准备蓝桥杯考试于是学习了下递归但是真的不是我等凡人能够轻易理解的。
此处传送门:递归算法详解
过后补充我的一些理解吧!
3月16日
记录一下蓝桥杯2017年第三题算法的思路。
#include <algorithm>
#include <string.h>
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int N = 29;
double num[N+2][N+2]={0};
double s(double a){
//if(a%2 == 1)printf("error\n");
return a/2;
}
int main()
{
freopen("DATA.txt","r",stdin); //重定向输入输出流,将DATA.txt指定输出到stdin这个标准输入流(键盘)中。
for(int i = 0 ; i < N ; i ++){
for(int j = 0 ; j <= i ; j ++)
{
scanf("%lf",&num[i][j]); //这一步就是从stdin中获取数据
// num[i][j] *= kkk;
}
}
for(int i = 1 ; i <= N; i ++){ //每块金属块承受的是上面两块各自重量的1/2,但是每行第一块和最后一块
num[i][0] += s(num[i-1][0]); //第一块只承受前一行第一块的重量的1/2,数组num最终结果是
//i行j金属块的自身重量加上它承受的重量
for(int j = 1 ; j < i ; j ++)
num[i][j] += s(num[i-1][j-1]+num[i-1][j]);
num[i][i] += s(num[i-1][i-1]); //最后一块承受的是前一行最后一块重量的1/2
}
int mi = 0,mx = 0;
for(int i = 1 ; i <= N ; i ++)
{
if(num[N][i] > num[N][mx])mx = i;
if(num[N][i] < num[N][mi])mi = i; //找出最后一行承受重量最大和最小的金属块
}
printf("%lf\n",num[N][mi]);
printf("%lf\n",num[N][mx]*((long long)2086458231)/num[N][mi]);
//每块承重和电子秤示数成比例也就是
//2086458231/num[N][mi]=?/num[N][mx]
return 0;
}
/*
3.886331
72665192664.000000
*/