虽然说是一道很水的题目吧,但毕竟是本弱渣没有看题解,第一次写出递归程序,虽然是很简单的
递归,甚至说可能不需要递归。
另外这题起初T了一发,其实sum数组最多只有80个数而已,没必要开太大。
另外这题我的写法还是有些繁琐,其实可以直接得出左右边界。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#include<algorithm>
#include<sstream>
#define LL long long
using namespace std;
const int maxn=1e2;
int sum[maxn];
void dfs(int n)
{
int a;
cin>>a;
if(a==-1)
return;
sum[n]+=a;
dfs(n-1);
dfs(n+1);
}
int main()
{
int cas=0;
int dd;
while(cin>>dd)
{
if(dd==-1)
break;
cas++;
memset(sum,0,sizeof(sum));
sum[maxn/2]=dd;
dfs(maxn/2-1);
dfs(maxn/2+1);
printf("Case %d:\n",cas);
int i;
for(i=0;i<maxn;i++)
if(sum[i])
{
cout<<sum[i];
break;
}
for(i=i+1;i<maxn;i++)
if(sum[i])
cout<<' '<<sum[i];
cout<<endl;
cout<<endl;
}
return 0;
}
直接得出左右边界:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#include<algorithm>
#include<sstream>
#define LL long long
using namespace std;
const int maxn=1e2;
int sum[maxn];
int l,r;
void dfs(int num,int ppos)
{
int x,y;
if(num!=-1)
{
if(ppos<l)l=ppos;
if(ppos>r) r=ppos;
sum[ppos]+=num;
cin>>x;
dfs(x,ppos-1);
cin>>y;
dfs(y,ppos+1);
}
}
int main()
{
int cas=0;
int dd;
while(cin>>dd)
{
if(dd==-1)
break;
cas++;
memset(sum,0,sizeof(sum));
l=40,r=40;
dfs(dd,40);
printf("Case %d:\n",cas);
int i;
for(i=l;i<r;i++)
cout<<sum[i]<<' ';
cout<<sum[r]<<endl;
cout<<endl;
}
return 0;
}