问题 A: 找规律
题目描述
在墙角放着一堆完全相同的立方体小木块,如下图所示:
因为这些木块堆得太有规律了,你只要知道它的层数就可以计算所有积木的数量了
输入
输入文件名为gui.in。
输入一个整数n,表示这堆小木块的层数
输出
输出文件名为 guii.out。
输出只有一个整数,表示这堆小木块的数量
样例输入
5
样例输出
35
提示
【数据范围】
对于100% 的数据,1 <= n <= 100
题解:c++语言基础题!!
#include<bits/stdc++.h>
using namespace std;
int main()
{
//freopen("gui.in","r",stdin);
//freopen("gui.out","w",stdout);
int n;
cin>>n;
int ans=0;
int sum=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)ans=ans+j;
}
cout<<ans<<endl;
}
问题 B: 三角形周长
题目描述
铁子从森林里收集了n根木棍,她开始将它们按顺序的排成一排,从左到右依次为1到n,她回想起在数学课上老师教她的三角形知识,她开始从这些木棍中间找三根木棍来组成一个周长最大的三角形,这时她的兄弟顺溜偷偷的溜了过来,偷走了第i根木棍,现在她想知道现在能够组成周长最大的三角形的周长是多少?
输入
第一行两个整数n和q。(1 ≤ n, q ≤ 105)
第二行n个整数表示第i根木棍的长度ai。(1 ≤ ai ≤ 109)
接下来q行,每行一个整数表示被顺溜偷走的木棍编号。注意每行的事件是独立的,也就是说每一次操作都是对于原来的n根木棍进行的。
输出
对于每个询问输出一行表示答案,如果删除木棍后无法组成三角形则输出 -1 。
样例输入
6 2
1 2 3 4 5 6
6
5
样例输出
12
13
题解:给木棍长度排序,(我这里用的降序,因为要保持周长最长),然后在循环里以每条边为中心判断能否组成三角形(用三角形任意两边之和一定大于第三边判断)若能,直接flag=true,跳出循环;若不能,周长减去边的长度,边数-1,继续循环判断。
如果最后flag=false,输出-1
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
struct node
{
int len;
int num;
}s[MAXN];
int n,q;
int i;
int comp(const node a,const node b)
{
return a.len>b.len;//降序
}
int main()
{
//freopen("zhou.in","r",stdin);
//freopen("zhou.out","w",stdout);
cin>>n>>q;
for(i=1;i<=n;i++)
{
cin>>s[i].len;
s[i].num=i;
}
sort(s+1,s+1+n,comp);//排序
while(q--)
{
int x;
i=1;
bool flag=false;
long long sum=0,gs=0;
cin>>x;
while(i<=n)
{
if(s[i].num!=x)//若不是被偷走的木棍
{
sum+=s[i].len;
gs++;
}
if(gs==3)
{
if(s[i].len+s[i+1].len>s[i+2].len)//若能组成三角形
{
cout<<sum<<endl;//输出
flag=true;
break;//跳出循环
}
else//若不能
{
sum-=s[i+2].len;//周长-边长
gs--;//边数-1
}
}
i++;
}
if(!flag)cout<<-1<<endl;//输出
}
}
问题 C: 放苹果
题目描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?5,1,1和1,5,1 是同一种分法(即顺序不影响分发)。
输入
输入文件为“apple.in”
输入为一行,包含二个整数M和N,以空格分开。
输出
输出文件为“apple.out”
输出一行,为方案数。
样例输入
7 3
样例输出
8
提示
【数据范围】
对于 100% 的数据,1<=M,N<=10。
题解:回溯板子题。注意盘子可以空着,即s[0]=0;
#include<bits/stdc++.h>
using namespace std;
int n,m;
int rest;
int ans=0;
int s[15];
void search(int dep)
{
if(dep==m+1)
{
if(rest==0)ans++;
return;
}
for(int i=s[dep-1];i<=rest;i++)
{
s[dep]=i;
rest-=i;
search(dep+1);//回溯
rest+=i;
}
}
int main()
{
//freopen("apple.in","r",stdin);
//freopen("apple.out","w",stdout);
cin>>n>>m;
rest=n;
s[0]=0;//盘子可以空着
search(1);//调用函数
cout<<ans<<endl;//输出
}