2019年暑假集训第七套题

问题 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;//输出
}

​
发布了43 篇原创文章 · 获赞 12 · 访问量 3651

猜你喜欢

转载自blog.csdn.net/xzerui/article/details/97173698