蓝桥杯真题2017B组


1、购物单

  • Excel数据处理计算
  • 复制到txt文本里面,利用Ctrl+H替换掉**这些字符和折扣。预处理好数据之后用代码计算
int main(){
    freopen("DATA.txt","r",stdin);
    double ans = 0,a,b;
    char buf[1110];
    while(scanf("%s%lf%lf",buf,&a,&b)!=EOF){
        ans += a*b/100;
    }
    printf("%lf\n",ans);
    return 0;
}
//5136.859500
答案:5200

2、等差素数列

3、承压计算

#include <bits/stdc++.h>
using namespace std;

int main(){
	double num[30][30]={0};
    for(int i=0;i<=28;i++)
        for(int j=0;j<=i;j++)
        cin>>num[i][j];
    //解题关键:第i行的第j个平均分给第i+1行的第j个和第i+1行的第j+1个
    for(int i=0;i<=28;i++)
        for(int j=0;j<=i;j++){
        num[i+1][j]+=num[i][j]/2;
        num[i+1][j+1]+=num[i][j]/2;
    }    
	double minn=999999999,maxn=0;
    for(int i=0;i<=29;i++){
        if(maxn<num[29][i]) maxn=num[29][i];
        if(minn>num[29][i]) minn=num[29][i];
    }
    cout<<fixed<<maxn*2086458231/minn<<endl;
}
答案:72665192664

4、方格分割

仔细观察样例数据可以发现,要满足题目所需要求,只需要剪切的线关于图案的中点中心对称。那么我们可以将格子格子之间接壤的看作边,边与边相交的看作点。则从(3,3)点出发,找一条边到达图案的外圈,不过值得注意的是,从(3,3)出发的是看错两个人出发,两个人的线路一直是对称。所以dfs中标记的时候要一步标记两个。

最后的结果要除以4,因为题目中说要旋转对称的图形属于是同一种。

#include <bits/stdc++.h>
using namespace std;

int vis[8][8]={0};//按顶点搜索0~6共7个——故7x7的二维数组
int mov[4][2]={1,0,-1,0,0,1,0,-1};
int ans;
void dfs(int x,int y){
	if(x==0||x==6||y==0||y==6) {//退出条件 
		ans++;
		return;
	}
	for(int i=0;i<4;i++){//上下左右移动 
		int xx=x+mov[i][0];int yy=y+mov[i][1];//移动一步 
		if(!vis[xx][yy]){ //判断下一步是否为未走过的路线,如果是则继续,不是就跳出循环 
			vis[xx][yy]=1;
			vis[6-xx][6-yy]=1;//对称标记走过的路线 
			dfs(xx,yy);//继续下一步 
			vis[xx][yy]=0;
			vis[6-xx][6-yy]=0;
		}
	}
}
int main() {
	vis[3][3]=1;//一定要记得标记!!!
	dfs(3,3);
	cout<<ans/4;
	return 0;
}
答案:509

5、取数位

递归的思想

答案:f(x/10,k)

6、最大公共子串

最大公共子串长度问题就是:
求两个串的所有子串中能够匹配上的最大长度是多少。

比如:"abcdkkk" 和 "baabcdadabc",
可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。

下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。
请分析该解法的思路,并补全划线部分缺失的代码。

#include <stdio.h>
#include <string.h>

#define N 256
int f(const char* s1, const char* s2)
{
    int a[N][N];
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int i,j;

    memset(a,0,sizeof(int)*N*N);
    int max = 0;
    for(i=1; i<=len1; i++){
        for(j=1; j<=len2; j++){
            if(s1[i-1]==s2[j-1]) {
                a[i][j] = __________________________;  //填空
                if(a[i][j] > max) max = a[i][j];
            }
        }
    }

    return max;
}

int main()
{
    printf("%d\n", f("abcdkkk", "baabcdadabc"));
    return 0;
}
a[i][j]的意义表示s1串前i个字符和s2串前j个字符的都各自包含最后一个字符的最大公共子串长度
答案:a[i-1][j-1]+1

7、

8、

9、

10、


文章作者: 冰冰的小屋
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 冰冰的小屋 !
  目录