蓝桥杯练习-1

A . 煤球数目 


Description

有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
....
如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

Input

没有任何输入

Output

请输入一个整数作为最后结果

Hint

例如最后结果为4300,请写程序使用printf()打印出4300

Source

第七届蓝桥杯省赛

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int i,sum=0;
	for(i=1;i<=100;i++)
	{
		sum+=i*(i+1)/2;
	}
	cout<<sum;
	return 0;
}

B . 生日蜡烛 


Description

某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?
请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字

Input

没有任何输入

Output

请输出一个整数

Source

第七届蓝桥杯省赛

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int i,j;
	for(i=1;i<100;i++)
	{
		for(j=i;j<100;j++)
		{
			if((i+j)*(j-i+1)/2==236)
			cout<<i;
		}
	}
	return 0;
}

C . 凑算式 


Description

A+BC+DEFGHI=10A+BC+DEFGHI=10

这个算式中A∼IA∼I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。 

Input

没有任何输入

Output

输出一个整数

Source

第七届蓝桥杯省赛

#include<bits/stdc++.h>
using namespace std;
int sum;
int num[9];
bool ok()
{
	double sum;
	int a=num[0];
	double b=num[1]*1.0/num[2];
	double c=(num[3]*100+num[4]*10+num[5])*1.0/(num[6]*100+num[7]*10+num[8]);
	if(fabs((a+b+c)-10)<1e-6) 
	return true;
	return false;
}
int main()
{
	for(int i=0;i<9;i++)
	num[i]=i+1;
	do
	{
		if(ok())
		sum++;
	}
	while(next_permutation(num, num + 9));
	cout << sum;

}

next_permutation(num,num+n)函数是对数组num中的前n个元素进行全排列,同时并改变num数组的值。.

E . 四平方和 [ 问题 2503  ] [ 讨论 ]


Description

四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去,就正好可以表示为4个数的平方和。
比如:

5=02+02+12+22,7=12+12+12+225=02+02+12+22,7=12+12+12+22

对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对4个数排序:0≤a≤b≤c≤d0≤a≤b≤c≤d
并对所有的可能表示法按 a,b,c,da,b,c,d 为联合主键升序排列,最后输出第一个表示法

Input

程序输入为一个正整数NN (N<5000000N<5000000)

Output

要求输出4个非负整数,按从小到大排序,中间用空格分开

Samples

Input 
5
12
773535
Output
0 0 1 2
0 2 2 2
1 1 267 838
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
     //为什么遍历是到 a*a<= n  b*b+a*a ?
    //因为都是 n==a*a+b*b+c*c+d*d 确定外层确定之后内层可以减去
    for(int a=0;a*a<=n;a++)
    {
    	for(int b=a;b*b+a*a<=n;b++)
    	{
    		for(int c=b;b*b+a*a+c*c<=n;c++)
                {
                    int t=n-a*a-b*b-c*c;
                    int d=sqrt(t);
                     if(d*d==t)//这样必定是升序最小
                        {
                            cout<<a<<" "<<b<<" "<<c<<" "<<d;
                            return 0;
                        }
                }
		}
	}
}
        

F . 交换瓶子 


Description

有NN个瓶子,编号1∼N1∼N,放在架子上。
比如有5个瓶子:
2 1 3 5 4
要求每次拿起2个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:
1 2 3 4 5
对于这么简单的情况,显然,至少需要交换2次就可以复位。
如果瓶子更多呢?你可以通过编程来解决。

Input

输入格式为两行:
第一行: 一个正整数NN(N<10000N<10000), 表示瓶子的数目
第二行:NN个正整数,用空格分开,表示瓶子目前的排列情况。

Output

输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。

Samples

Input 
5
3 1 2 5 4
5
5 4 3 2 1
Output
3
2

Source

第七届蓝桥杯省赛

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,a[10010],sum=0,i,t;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(i=1;i<=n;i++)
	{
		while(a[i]!=i)
		{
			t=a[a[i]];
			a[a[i]]=a[i];
			a[i]=t;
			sum++;
		}
	}
	cout<<sum;
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值