codeforces 339C

来源:互联网 发布:网络推手阿建电话 编辑:程序博客网 时间:2024/06/04 18:13

题目链接:http://codeforces.com/problemset/problem/339/C

题目大意:

有不同质量的砝码无限多个,现在只让你在天平两边放入m个,要求

1.每次在天平放一个,一次左边,下一次右边

2.相邻两次质量必须不同

3.放入砝码后,保证放入的这边总重严格大于另外一边。

题目求解:简单的dfs即可~

#include<iostream>using namespace std;int dfs(int step,int left,int right,int last,int record[],const int m,const int b[],const int jmax){    int cur = (step%2 == 0)?right:left;    int other = (step%2 == 1)?right:left;    if(step > m)      {            return 0;    }    for(int j = 1; j <= jmax;j++)    {            if((last != b[j] || last == 0) && b[j]+cur>other)            {                    int ltemp = left,rtemp = right;                    if(left == cur)                       ltemp += b[j];                    else                        rtemp += b[j];                                           record[step] = b[j];                    if(step == m)                       {                            cout<<"YES"<<endl;                            for(int i = 1; i <= m;i++)                            {                                    if(i<m) cout<<record[i]<<" ";                                    else cout<<record[i];                            }                            return 1;                    }                    if(dfs(step+1,ltemp,rtemp,b[j],record,m,b,jmax)) return 1;                    record[step] = 0;            }     }    return 0;}int main(){    char s[20];    cin>>s;    int b[11] = {0};    int record[1002] = {0};    int j = 1;    for(int i = 0; i<= 9;i++)    {            if(s[i] == '1')   b[j++] = i+1;    }    int jmax = j-1;    int m;    cin>>m;    if(dfs(1,0,0,0,record,m,b,jmax) == 0)  cout<<"NO";    return 0;}


原创粉丝点击