华师一附中OI组
标题:
P1473 零的数列 Zero Sum
[打印本页]
作者:
admin
时间:
2018-5-17 13:19
标题:
P1473 零的数列 Zero Sum
https://www.luogu.org/problemnew/show/P1473
题目描述
请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。 现在请在数列中插入“+”表示加,或者“-”表示减,“ ”表示空白(例如1-2 3就等于1-23),来将每一对数字组合在一起(请不要在第一个数字前插入符号)。 计算该表达式的结果并判断其值是否为0。 请你写一个程序找出所有产生和为零的长度为N的数列。
输入输出格式
输入格式:
单独的一行表示整数N (3 <= N <= 9)。
输出格式:
按照ASCII码的顺序,输出所有在每对数字间插入“+”, “-”, 或 “ ”后能得到结果为零的数列。
输入输出样例
输入样例#1:
7
输出样例#1:
1+2-3+4-5-6+7
1+2-3-4+5+6-7
1-2 3+4+5+6+7
1-2 3-4 5+6 7
1-2+3+4-5+6-7
1-2-3-4-5+6+7
说明
翻译来自NOCOW
USACO 2.3
作者:
张笑宇
时间:
2018-5-31 22:51
思路:在1前面加一个”+“
#include<iostream>
using namespace std;
int n,f[10];///f为每个空填的字符
string s[4];///1是“ ” 2是“+” 3是“-”
void pp()
{
for (int i=2; i<=n; i++)
cout<<i-1<<s[f[i]];
cout<<n<<endl;
}
bool check()
{
int s,sum=0,bb=1;
for (int i=1; i<=n; i++)
{
if (f[i]==1) continue;///' '就跳过
s=i;
for (int j=i+1; j<=n; j++)
{
if (f[j]!=1) break;
s=10*s+j;
}
if (f[i]==2) sum=sum+s,bb=0;
else sum=sum-s,bb=0;
}
if (sum==0&&bb==0) return true;
else return false;
}
void dfs(int x)///搜索到第x个空
{
if (x==n+1)///一共(n-1)个空 1前加了一个+
{
if (check()) pp();
}
else for (int i=1; i<=3; i++)
{
f[x]=i;
dfs(x+1);
f[x]=0;
}
}
int main()
{
cin>>n;
s[1]=' ',s[2]='+',s[3]='-';
f[1]=2;///在1前加一个‘+’
dfs(2);///从第二个开始找
return 0;
}
复制代码
作者:
YTC
时间:
2018-6-30 19:08
#include<bits/stdc++.h>
using namespace std;
int n;
char c[15];
int sum;
void dfs(int k,int ans,int p)//1+ 2-
{
if(k==n)
{
if(p==1) sum+=ans;
if(p==2) sum-=ans;
//cout<<sum<<endl;
if(sum==0)
{for(int i=1;i<n;i++) cout<<i<<c[i];
cout<<n<<endl;}
if(p==1) sum-=ans;
if(p==2) sum+=ans;
return;
}
else
{
if(p==1) {
c[k]=' ';
dfs(k+1,ans*10+k+1,1);
sum+=ans;
c[k]='+';
dfs(k+1,k+1,1);
c[k]='-';
dfs(k+1,k+1,2);
sum-=ans;
}
if(p==2)
{
c[k]=' ';
dfs(k+1,ans*10+k+1,2);
sum-=ans;
c[k]='+';
dfs(k+1,k+1,1);
c[k]='-';
dfs(k+1,k+1,2);
sum+=ans;
}
}
}
int main()
{
cin>>n;
dfs(1,1,1);
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2