2016年省赛c组

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%10)*(n%10);
				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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值