CF339C Xenia and Weights (dfs)

一看数据范围很小,直接暴力搜索判断,枚举m位看能否满足条件,递归的时候分奇偶,因为每次加的方向不一样,之后比对一下是否相同以及是否比他大

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<algorithm>
#include<queue>
#define ull unsigned long long
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=1e5+10;
int a[N];
string s;
int m;
int cnt;
int num[N];
int dfs(int u,int l,int r,int x){
    if(u==m+1){
        return 1;
    }
    int i;
    for(i=1;i<=cnt;i++){
        if(u%2!=0&&x!=a[i]&&l+a[i]>r){
            num[u]=a[i];

            if(dfs(u+1,l+a[i],r,a[i]))
                return 1;
        }
        if(u%2==0&&x!=a[i]&&r+a[i]>l){
            num[u]=a[i];
            if(dfs(u+1,l,r+a[i],a[i]))
                return 1;
        }
    }
    return 0;
}
int main(){
    cin>>s>>m;
    int i;
    for(i=0;i<s.size();i++){
        if(s[i]=='1'){
            cnt++;
            a[cnt]=i+1;
        }
    }
    if(dfs(1,0,0,0)){
        printf("YES
");
        for(i=1;i<=m;i++){
            printf("%d ",num[i]);
        }
        cout<<endl;
    }
    else{
        cout<<"NO"<<endl;
    }
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/12619586.html