CCF 201909-2 小明种苹果(续) (C++)

201909-2 小明种苹果(续)

试题编号: 201909-2
试题名称: 小明种苹果(续)
时间限制: 1.0s
内存限制: 512.0MB
问题描述:
解题过程

第一次写这道题是在CCF考试上,拿了90分,再次回顾时发现是自己多考虑了(或者说是题目没描述清楚)。
求总数和掉落棵数应该都不难,和上题差不多思路。
这里求连续掉落组数时,如果只有3棵树,且每棵都有掉落。那么该有3组还是1组呢?我认为题目并没有表达出来,所以在初次做题时我考虑了这点并且认为这种情况是只有1组。
这里用的是循环队列的方式模拟这些树是围圈的来求连续组数的,对每一棵树都进行判断即可。

AC代码
#include
#include
using namespace std;
struct Tree
{
     
	int apple=0;
	bool drop=0;
};
int main()
{
     
	int n;
	cin>>n;
	Tree t[n];
	int m;
	int r;
	for(int i=0;i<n;i++)
	{
     
		cin>>m;
		cin>>r;
		t[i].apple=r;//第一个数总是为苹果个数 
		for(int j=1;j<m;j++)
		{
     
			cin>>r;
			if(r>0)
			{
     
				if(r!=t[i].apple)
				{
     
					t[i].drop=1;
					t[i].apple=r;
				}
			}
			else
				t[i].apple+=r;
		}
	}
	int asum=0,dsum=0;
	deque <Tree> d;//双端队列,用来模拟循环队列 
	for(int i=0;i<n;i++)
	{
     
		asum+=t[i].apple;
		if(t[i].drop)
			dsum++;
		d.push_back(t[i]);
	}
	Tree temp,temp1,temp2;
	int lsum=0;
	for(int i=0;i<n;i++)//通过循环队列来判断连续掉落组数 
	{
     
		temp=t[i];
		d.pop_front();
		d.push_back(temp);
		if(t[i].drop)
		{
     
			temp1=d.front();
			d.pop_front();
			temp2=d.front();
			d.push_front(temp1);
			if(temp1.drop&&temp2.drop)
				lsum++;
		}
	}
	cout<<asum<<' '<<dsum<<' '<<lsum;
	return 0;
} 

你可能感兴趣的:(队列,数据结构,算法,c++,csp)