题意:给你无穷多个1-10的,从 1-m不停的放到天平两端,两次连续放置要在不同的天平和放不同的重量,使得每一次放置这边的天平都比对面的重量多。

解题思路:

1)暴搜,如果估算的话还是过不了的,但实际情况比估算好太多了   62ms

 
 1 // File Name: 339c.cpp
 2 // Author: darkdream
 3 // Created Time: 2014年08月03日 星期日 16时38分23秒
 4 
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 
26 using namespace std;
27 int ans[1004];
28 int num = 0 ; 
29 int b[30];
30 int lb = 0; 
31 int m; 
32 int dfs(int num ,int last ,int k)
33 {
34     if(k == m + 1)
35         return 1 ;
36     for(int i = 1;i <= lb ;i ++)
37     {
38        if(b[i] > num && b[i] != last)
39        {
40            if(dfs(b[i]-num,b[i],k+1))
41            {
42                ans[k] = b[i];
43                return 1;
44            }
45        }
46     }
47     return 0 ; 
48 }
49 int main(){
50    char str[14];
51    scanf("%s",str);
52    scanf("%d",&m);
53    int len = strlen(str);
54    for(int i = 0;i < len; i ++)
55    {
56           if(str[i] == '1')
57             {
58               lb ++ ; 
59               b[lb] = i+1 ;
60             }
61    }
62    if(dfs(0,0,1))
63    {
64      printf("YES\n") ;
65      for(int i =1 ;i <= m;i ++)
66          printf("%d ",ans[i]);
67    }else{
68      printf("NO\n");
69    }
70 return 0;
71 }
View Code

相关文章: