重庆师范大学第一届ACM选拔赛(公开赛)B.有趣的求和

重庆师范大学第一届ACM选拔赛(公开赛)B.有趣的求和

题目链接

题目描述

输入一组数据,包含M个整数(3 <= M <= 20),它们只能进行加法或者减法操作,你判断前M-1个数进行加或减操作后,结果是否可以等于第M个数,若没有方法可以得到第M个数,则只输出一行,为0。反之则输出共有两部分,第一部分在第一行输出,表示有多少种方式可以得到第M个数,第二部分从第二行开始为从左到右依次执行的操作(要求输出所有方式)。

输入描述:

第一行输入M
第二行输入M个整数,M个整数相互之间用空格隔开

输出描述:

1、没有方法可以得到第M个数,则只输出一行,为0
2、第一行输出有多少方式得到第M个数,其余各行分别输出操作方式

示例1

输入

6
1 2 3 3 2 1

输出

4
--++
-+-+
+-+-
++--

直接暴力列举所有情况即可,很多人用的 DFS,我直接用的二进制表示,注意要对答案排序,这点坑死了,AC代码如下:

#include
using namespace std;
typedef long long ll;
int main(){
    vector<string>v;
    int n,a[30];
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=0;i<(1<<(n-2));i++){
        int sum=a[0];
        string ans="";
        for(int j=0;j<n-2;j++){
            if((i&(1<<j))==0) sum-=a[j+1],ans+='-';
            else sum+=a[j+1],ans+='+';
        }
        if(sum==a[n-1]){
            v.push_back(ans);
        }
    }
    sort(v.rbegin(),v.rend());
    cout<<v.size()<<endl;
    for(auto i:v) cout<<i<<endl;
}

你可能感兴趣的:(位运算,牛客)