2016

煤球数目 

有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
....
如果一共有100层,共有多少个煤球?
规律:每层都是前n项和,for循环+等差数列公式

答案:171700

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#include <iostream>
using namespace std;
int main()
{
	int a;
	cin>>a;
	int res=0;
	for(int i=1;i<=a;i++)
	{
		res=res+(1+i)*i/2;
	}
	cout<<res<<endl;
	return 0;
}

生日蜡烛

某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?
请填写他开始过生日party的年龄数。
答案:26

两个等差数列的和相减得到236根蜡烛。注意,25岁(包括25岁之前,都没有过生日party),所以是从25岁之后即26岁开始party的。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#include <iostream>
using namespace std;
int main()
{
	int a,b;
	for(int i=1;i<=100;i++)
	{
		for(int j=i;j<=100;j++)
		{
			if((j+i+1)*(j-i)/2==236)
			{
				a=i;b=j;break;
			}
		}
	}
	cout<<a<<" "<<b<<endl;
	return 0;
}

凑算式

如图,这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。


比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?

答案:29

9个for循环注意中间有相等的要跳过去(continue)。将除法公式换成乘法相等的式子。

快速排序

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#include <iostream>
using namespace std;

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);//i指针往后挪
		while(a[--j]>x);//j指针往前挪
		if(i>=j) break;//i,j相遇 停止!
		swap(a,i,j);
	}
	//填空
	swap(a,p,j);//最初那个值和最后的j交换
	return j;
}
//5,13,6,24,2,8,19,27,6,12,1,17
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;
}

要理解快速排序的算法思想。

抽签
X星球要派出一个5人组成的观察团前往W星。
其中:
A国最多可以派出4人。
B国最多可以派出2人。
C国最多可以派出2人。
....
那么最终派往W星的观察团会有多少种国别的不同组合呢?
下面的程序解决了这个问题。
数组a[] 中既是每个国家可以派出的最多的名额。

程序执行结果为:

DEFFF
CEFFF
CDFFF
CDEFF
CCFFF
CCEFF
CCDFF
CCDEF

BEFFF

BDFFF
BDEFF
BCFFF
BCEFF
BCDFF
BCDEF
....

(以下省略,总共101行)

递归的方法   (仔细观察k的值没有变化,m的值没有变化,所以此行需要将它们都给变化了,代码这么短,怕是用递归的方法来写,那就四个值都试试,凑出来如果输出了结果,那就对了)

一共选M个人,m经过选择记录剩下可选人数,M-m为已经选择的人数,M-m+j为新加入的人在b数组中的下标。这题在填空之后可以利用总共101行这个条件进行验证,即:在f函数每次printf输出的时候进行统计个数,最后输出sum检测是否为101。注意不要多填分号。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#include <iostream>
using namespace std;
#define N 6
#define M 5
#define BUF 1024
void f(int a[],int k,int m,char b[])
{
	int i,j;
	
	if(k==N){
		b[M] = 0;
		if(m==0) printf("%s\n",b);
		return;
	}
	
	for(i=0; i<=a[k]; i++){
		for(j=0; j<i; j++) b[M-m+j] = k+'A';
		f(a,k+1,m-i,b);  //填空位置
	}
}
int main()
{
	int  a[N] = {4,2,2,1,1,3};
	char b[BUF];
	f(a,0,M,b);
	return 0;
}
方格填数

如图,如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?

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


注意每次“剪枝”,相邻的部分abs(差)不等1,还有就是和前面的字母都不相等。如果那样。就continue。

暴力。直接怼9个for循环。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#include <iostream>
using namespace std;
int main()
{
	int sum=0;
	for(int a=0; a<=9; a++)
		for(int b=0; b<=9; b++)
		{
			if(abs(b-a)==1||b==a) continue;
			for(int c=0; c<=9; c++)
			{
				if(abs(c-b)==1||c==a||c==b) continue;
				for(int d=0; d<=9; d++)
				{
					if(abs(d-a)==1||d==a||d==b||d==c) continue;
					for(int e=0; e<=9; e++)
					{
						if(abs(e-a)==1||abs(e-b)==1||abs(e-d)==1||e==a||e==b||e==c||e==d) continue;
						for(int f=0; f<=9; f++)
						{
							if(abs(f-a)==1||abs(f-b)==1||abs(f-c)==1||abs(f-e)==1||f==a||f==b||f==c||f==d||f==e) continue;
							for(int g=0; g<=9; g++)
							{
								if(abs(g-b)==1||abs(g-c)==1||abs(g-f)==1||g==a||g==b||g==c||g==d||g==e||g==f) continue;
								for(int h=0; h<=9; h++)
								{
									if(abs(h-d)==1||abs(h-e)==1||h==a||h==b||h==c||h==d||h==e||h==f||h==g) continue;
									for(int i=0; i<=9; i++)
									{
										if(abs(i-d)==1||abs(i-e)==1||abs(i-f)==1||abs(i-h)==1||i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h) continue;
										for(int j=0; j<=9; j++)
										{
											if(abs(j-e)==1||abs(j-f)==1||abs(j-g)==1||abs(j-i)==1||j==a||j==b||j==c||j==d||j==e||j==f||j==g||j==h||j==i) continue;
											sum++;
										}
										
									}
								}
							}
						}
					}
				}
			}
		}
	
	cout<<sum<<endl;
	
	return 0;
}

剪邮票(不怎么会)

如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。

请你计算,一共有多少种不同的剪取方法。



先找到5个数的组合,然后从第一个数字开始遍历,经过上下左右操作检测5个数是否都被访问一遍,如果5个数都可以遍历到则种类+1。
在原图中向上为-4,向下为+4,向左为-1,向右为+1,但是遇到3 4 5 7 8这种4+1=5但是这种情况不符合,所以重构一下原图:这样,向上为-5,向下为+5,向左为-1,向右为+1,避免了每行最后一个+1后等于下一行第一个的情况。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值