第七届蓝桥杯省赛A组题解(1~5)

来源:互联网 发布:日程提醒软件 编辑:程序博客网 时间:2024/06/05 04:11
1. 网友年龄

某君新认识一网友。
当问及年龄时,他的网友说:
“我的年龄是个2位数,我比儿子大27岁,
如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄”
请你计算:网友的年龄一共有多少种可能情况?

提示:30岁就是其中一种可能哦.

请填写表示可能情况的种数。

注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

#include<stdio.h>#include<iostream>#include<cstring>#include<queue>#include<algorithm>using namespace std;int main(){int a,b;int ans=0;for(int i=0;i<=9;i++){for(int j=0;j<=9;j++){if(((i*10+j)-(j*10+i))==27) ans++;}}printf("%d\n",ans);return 0;}


答案:7;


2.


生日蜡烛

某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。

现在算起来,他一共吹熄了236根蜡烛。

请问,他从多少岁开始过生日party的?

请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。


答案:26


3.

方格填数

如下的10个格子
   +--+--+--+
   |  |  |  |
+--+--+--+--+
|  |  |  |  |
+--+--+--+--+
|  |  |  |
+--+--+--+

(如果显示有问题,也可以参看【图1.jpg】)

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。


#include<stdio.h>#include<iostream>#include<cstring>#include<queue>#include<algorithm>using namespace std;int q[3][4]={0};int mark[10]={0};int num=0;void f(int n){if(n==11){int j,k,t=0;for(j=0;j<3;j++){for(k=0;k<4;k++){//左上角 if(j>0&&k>0&&abs(q[j][k]-q[j-1][k-1])==1) {t=1;break;}//右上角 if(j>0&&k<3&&abs(q[j][k]-q[j-1][k+1])==1) {t=1;break;}//左下角                if(j<2&&k>0&&abs(q[j][k]-q[j+1][k-1])==1) {t=1;break;}                //右下角 if(j<2&&k<3&&abs(q[j][k]-q[j+1][k+1])==1) {t=1;break;}//上if(j>0&&abs(q[j][k]-q[j-1][k])==1) {t=1;break;}//下 if(j<2&&abs(q[j][k]-q[j+1][k])==1) {t=1;break;}//左 if(k>0&&abs(q[j][k]-q[j][k-1])==1) {t=1;break;}//右 if(k<3&&abs(q[j][k]-q[j][k+1])==1) {t=1;break;}}if(t==1) break;}if(t==0){num++;}return;}for(int i=0;i<=9;i++){if(mark[i]==0){mark[i]=1;q[n/4][n%4]=i;f(n+1);mark[i]=0;}}}int main(){q[0][0]=q[2][3]=9999;f(1);cout<<num<<endl;return 0;}


DFS:

#include<stdio.h>#include<iostream>#include<cstring>#include<queue>#include<algorithm>using namespace std;int map[7][7],ans;bool vis[11];const int dx[4]={0,-1,-1,-1};const int dy[4]={-1,-1,0,1};int  check(int r,int c,int n) {    for(int i=0;i<4;++i)        if(abs(map[r][c]-map[r+dx[i]][c+dy[i]])<=1)            return 0;    return 1;}void dfs(int r,int c) {    if(r==3&&c==4)        ++ans;    for(int i=0;i<=9;++i) {        map[r][c]=i;        if(!vis[i]&&check(r,c,i)) {            vis[i]=true;            int rr=r,cc=c+1;            if(cc>4) {                ++rr;                cc=1;            }            dfs(rr,cc);            vis[i]=false;        }        map[r][c]=-9;    }}int main(){    for(int i=0;i<7;++i) {        for(int j=0;j<7;++j) {            map[i][j]=-9999;        }        vis[i]=false;    }    vis[7]=vis[8]=vis[9]=false;    ans=0;    dfs(1,2);    printf("%d",ans);    return 0;}


答案:1580


4.

快速排序

排序在各种场合经常被用到。
快速排序是十分常用的高效率的算法。

其思想是:先选一个“标尺”,
用它把整个队列过一遍筛子,
以保证:其左边的元素都不大于它,其右边的元素都不小于它。

这样,排序问题就被分割为两个子区间。
再分别对子区间排序就可以了。

下面的代码是一种实现,请分析并填写划线部分缺少的代码。

#include <stdio.h>void swap(int a[], int i, int j){int t = a[i];a[i] = a[j];a[j] = t;}int partition(int a[], int p, int r){    int i = p;    int j = r + 1;    int x = a[p];    while(1){        while(i<r && a[++i]<x);        while(a[--j]>x);        if(i>=j) break;        swap(a,i,j);    }______________________;    return j;}void quicksort(int a[], int p, int r){    if(p<r){        int q = partition(a,p,r);        quicksort(a,p,q-1);        quicksort(a,q+1,r);    }}    int main(){int i;int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};int N = 12;quicksort(a, 0, N-1);for(i=0; i<N; i++) printf("%d ", a[i]);printf("\n");return 0;}

答案:swap(a,p,j)


5.

消除尾一

下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0
如果最后一位是0,则原数字保持不变。

如果采用代码中的测试数据,应该输出:
00000000000000000000000001100111   00000000000000000000000001100000
00000000000000000000000000001100   00000000000000000000000000001100

请仔细阅读程序,填写划线部分缺少的代码。

#include <stdio.h>void f(int x){int i;for(i=0; i<32; i++) printf("%d", (x>>(31-i))&1);printf("   ");x = _______________________;for(i=0; i<32; i++) printf("%d", (x>>(31-i))&1);printf("\n");}int main(){f(103);f(12);return 0;}


如果一个数用二进制表示时,若个位是1,则去掉从个位起开始的连续的1,若个位不是1,则不变。


答案:x&(x+1)

注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。


1 0
原创粉丝点击