题目描述
给定一个整数数组a1,a2,…,ana1,a2,…,an。
定义数组第 i 位上的减操作:把aiai和ai+1ai+1换成ai−ai+1ai−ai+1。
用con(a,i)表示减操作,可以表示为:
con(a,i)=[a1,a2,…,ai−1,ai−ai+1,ai+2,…,an]
con(a,i)=[a1,a2,…,ai−1,ai−ai+1,ai+2,…,an]
长度为 n 的数组,经过 n-1 次减操作后,就可以得到一个整数t。
例如数组[12,10,4,3,5]经过如下操作可得到整数4:
con([12,10,4,3,5],2)=[12,6,3,5]con([12,6,3,5],3)=[12,6,−2]con([12,6,−2],2)=[12,8]con([12,8],1)=[4]
con([12,10,4,3,5],2)=[12,6,3,5]con([12,6,3,5],3)=[12,6,−2]con([12,6,−2],2)=[12,8]con([12,8],1)=[4]
现在给定数组以及目标整数,求完整操作过程。
输入格式
第1行包含两个整数n和t。
第2…n+1行:第i行包含数组中的第 i 个整数aiai。
输出格式
输出共n-1行,每行包含一个整数,第 i 行的整数表示第 i 次减操作的操作位置。
数据范围
1≤n≤100−10000≤t≤100001≤ai≤100
1≤n≤100−10000≤t≤100001≤ai≤100
输入样例:
5 4
12
10
4
3
5
输出样例:
2
3
2
1
状态初始条件:a(1)(d[1])=1,a(2)(d[1]-d[2])=-1;
状态转移方程:a(i)(j)=-1 if a(i-1)(j+w[i])!=0,a(i)(j)=1 if a(i-1)(j-w[i])!=0
题解
#include<bits/stdc++.h>
using namespace std;
const int SUM=15000;
int d[10005];
int a[105][30005];
int ans[10005];
int main()
{
int x,y;
cin>>x>>y;
for(int i=1;i<=x;i++)
{
cin>>d[i];
}
a[1][SUM+d[1]]=1;
a[2][SUM+d[1]-d[2]]=-1;
for(int i=3;i<=x;i++)
{
for(int j=-10000+SUM;j<=10000+SUM;j++)
{
if(a[i-1][j])
{
a[i][j+d[i]]=1;
a[i][j-d[i]]=-1;
}
}
}
int temp=y+SUM;
for(int i=x;i>=2;i--)
{
ans[i]=a[i][temp];
if(ans[i]==1)
{
temp-=d[i];
}
else if(ans[i]==-1)
{
temp+=d[i];
}
}
int tot=0;
/*for(int i=1;i<=x;i++)
{
cout<<ans[i]<<" ";
}
cout<<endl;*/
for(int i=2;i<=x;i++)
{
if(ans[i]==1)
{
cout<<i-tot-1<<endl;
tot++;
}
}
for(int i=2;i<=x;i++)
{
if(ans[i]==-1)
{
cout<<1<<endl;
}
}
return 0;
}