2016年省赛c组

    科技2022-07-12  112

    A 报纸页数

    刷题链接: link.

    X星球日报和我们地球的城市早报是一样的,都是一些单独的纸张叠在一起而已。每张纸印有4版。

    比如,某张报纸包含的4页是:5,6,11,12,可以确定它应该是最上边的第2张报纸。

    我们在太空中捡到了一张X星球的报纸,4个页码分别是:

    1125,1126,1727,1728

    请你计算这份报纸一共多少页(也就是最大页码,并不是用了几张纸哦)?

    请填写表示总页数的数字。

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

    参考代码(暴力解题)

    #include<bits/stdc++.h> using namespace std; int main() { int a=1125,b=1126,c=1727,d=1728; printf("%d",d+a-1); return 0; }

    B 煤球数目

    刷题链接: link.

    有一堆煤球,堆成三角棱锥形。具体:

    第一层放1个,

    第二层3个(排列成三角形),

    第三层6个(排列成三角形),

    第四层10个(排列成三角形),

    如果一共有100层,共有多少个煤球?

    请填表示煤球总数目的数字。

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

    参考代码(暴力解题)

    #include<bits/stdc++.h> using namespace std; int main() { long long a[110]; long long sum=0; for(int i=1;i<=100;i++) { for(int j=1;j<=i;j++) { sum+=j; } } printf("%lld",sum); return 0; }

    C 平方怪圈

    刷题链接: link.

    如果把一个正整数的每一位都平方后再求和,得到一个新的正整数。

    对新产生的正整数再做同样的处理。

    如此一来,你会发现,不管开始取的是什么数字,

    最终如果不是落入1,就是落入同一个循环圈。

    请写出这个循环圈中最大的那个数字。

    请填写该最大数字。

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

    我的代码(暴力)

    #include<bits/stdc++.h> using namespace std; int main() { for(int n=1;n<=200;n++) { int max; int count=0; while(true) { int t=0; while(n) { t=t+(n)*(n); n=n/10; } n=t; count++; if(t>max) max=t; if(n==1) break; if(count==1000) printf("%d",max); } } return 0; }

    参考代码

    #include<bits/stdc++.h> using namespace std; int main() { return 0; }

    D 打印方格

    刷题链接: link.

    小明想在控制台上输出 m x n 个方格。

    比如 10x4的,输出的样子是:

    +---+---+---+---+---+---+---+---+---+---+ | | | | | | | | | | | +---+---+---+---+---+---+---+---+---+---+ | | | | | | | | | | | +---+---+---+---+---+---+---+---+---+---+ | | | | | | | | | | | +---+---+---+---+---+---+---+---+---+---+ | | | | | | | | | | | +---+---+---+---+---+---+---+---+---+---+

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

    以下是小明写的程序,请你分析其流程,填写划线部分缺少的代码。

    //打印m列,n行的方格 void f(int m, int n) { int row; int col; for(row=0; row<n; row++){ for(col=0; col<m; col++) printf("+---"); printf("+\n"); for(col=0; col<m; col++) printf("| "); printf("|\n"); } printf("+"); _____________________________; //填空 printf("\n"); } int main() { f(10,4); return 0; }

    注意:仅仅填写划线部分缺少的内容,不要添加任何已有内容或说明性文字。

    完整代码

    #include <stdio.h> //打印m列,n行的方格 void f(int m, int n) { int row; int col; for(row=0; row<n; row++){ for(col=0; col<m; col++) printf("+---"); printf("+\n"); for(col=0; col<m; col++) printf("| "); printf("|\n"); } printf("+"); for(col=0; col<m; col++) printf("---+"); //填空 printf("\n"); } int main() { f(10,4); return 0; }

    E 快速排序

    刷题链接: link. 刷题链接: link.

    排序在各种场合经常被用到。

    快速排序是十分常用的高效率的算法。

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

    这样,排序问题就被分割为两个子区间。

    再分别对子区间排序就可以了。

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

    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; }

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

    完整代码

    #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); } swap(a,j,p); //填空位置 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; }

    F 凑算式

    刷题链接: link.

    B DEF A + --- + ------- = 10 C GHI

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

    这个算式中AI代表19的数字,不同的字母代表不同的数字。

    比如: 6+8/3+952/714 就是一种解法, 5+3/1+972/486 是另一种解法。

    这个算式一共有多少种解法?

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

    参考代码(全排列)

    #include<bits/stdc++.h> using namespace std; int main() { int count=0; double a[10]={1,2,3,4,5,6,7,8,9}; do{ double s1=a[1]/a[2]*1.0; double s2=a[3]*100+a[4]*10+a[5]; double s3=a[6]*100+a[7]*10+a[8]; if((a[0]+s1+(s2/s3*1.0))==10.0) { count++; //printf("%.0f+%.0f/%.0f+%.0f%.0f%.0f/%.0f%.0f%.0f\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]); } }while(next_permutation(a,a+9)); printf("%d",count); return 0; }

    G 寒假作业(该题还不会做。。)

    刷题链接: link.

    现在小学的数学题目也不是那么好玩的。

    看看这个寒假作业:

    □ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □

    (如果显示不出来,可以参见【图1.jpg】)

    每个方块代表1~13中的某一个数字,但不能重复。 比如: 6 + 7 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5

    以及: 7 + 6 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5

    就算两种解法。(加法,乘法交换律后算不同的方案)

    你一共找到了多少种方案?

    请填写表示方案数目的整数。

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

    注意:该题全排列会超时。

    #include<bits/stdc++.h> using namespace std; int main() { return 0; }

    H 冰雹数

    刷题链接: link.

    任意给定一个正整数N,

    如果是偶数,执行: N / 2

    如果是奇数,执行: N * 3 + 1

    生成的新的数字再执行同样的动作,循环往复。

    通过观察发现,这个数字会一会儿上升到很高,

    一会儿又降落下来。

    就这样起起落落的,但最终必会落到“1”

    这有点像小冰雹粒子在冰雹云中翻滚增长的样子。

    比如N=9

    9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1

    可以看到,N=9的时候,这个“小冰雹”最高冲到了52这个高度。

    输入格式: 一个正整数N(N<1000000) 输出格式: 一个正整数,表示不大于N的数字,经过冰雹数变换过程中,最高冲到了多少。 例如,输入: 10 程序应该输出: 52 再例如,输入: 100 程序应该输出: 9232

    注意:

    1.该题需要优化
    2.注意爆int

    参考代码:

    #include<bits/stdc++.h> using namespace std; int main() { long long max=0; int m; scanf("%d",&m); for(int i=3;i<=m;i+=2) { long long n=i; while(n>=i) { n=n*3+1; if(n>max) max=n; while(n%2==0) n=n/2; } } printf("%lld",max); return 0; }

    I 卡片换位(暂时还不会做)

    刷题链接: link.

    你玩过华容道的游戏吗?

    这是个类似的,但更简单的游戏。

    看下面 3 x 2 的格子

    +---+---+---+ | A | * | * | +---+---+---+ | B | | * | +---+---+---+

    在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。

    还有一个格子是空着的。

    你可以把一张牌移动到相邻的空格中去(对角不算相邻)。

    游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。

    输入格式:

    输入两行6个字符表示当前的局面

    输出格式:

    一个整数,表示最少多少步,才能把AB换位(其它牌位置随意)

    例如,输入: * A **B 程序应该输出: 17 再例如,输入: A B *** 程序应该输出: 12

    参考代码:

    #include <bits/stdc++.h> using namespace std; int main() { return 0; }

    J 密码脱落(该题暂时还不会做。。)

    刷题链接: link.

    X星球的考古学家发现了一批古代留下来的密码。

    这些密码是由A、B、C、D 四种植物的种子串成的序列。

    仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。

    由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。

    你的任务是:

    给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。

    输入一行,表示现在看到的密码串(长度不大于1000)

    要求输出一个正整数,表示至少脱落了多少个种子。

    例如,输入: ABCBA 则程序应该输出: 0 再例如,输入: ABDCDCBABC 则程序应该输出: 3

    思路:

    参考代码:

    #include <bits/stdc++.h> using namespace std; int main() { return 0; }
    Processed: 0.012, SQL: 8