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∼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个数的平方和。
比如:
对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对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
5 12 773535
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
5 3 1 2 5 4 5 5 4 3 2 1
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;
}