题意:给你无穷多个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

 2)DP

dp[i][j][k],基本上和暴搜类似,i,表示层数,j表示状态,k表示上次选的是哪个数,但是去除了重复的情况,代码吃完饭回来再写QAQ        然后发现跑的时间还是 62ms 。。

应该是10^8  比 1)的 10^1000期望好太多了,可能答案有限吧。

 1 // File Name: 339.1.cpp
 2 // Author: darkdream
 3 // Created Time: 2014年08月03日 星期日 17时13分53秒
 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 dp[1004][14][14];
28 int lb = 0 ;;
29 int b[100];
30 int m ;
31 void dfs(int i, int j ,int k )
32 {
33     if(i == 0 )
34         return; 
35     dfs(i-1,k-j,dp[i][j][k]);
36     printf("%d ",k);
37 }
38 int main(){
39     char str[14];
40     scanf("%s",str);
41     scanf("%d",&m);
42     int len = strlen(str);
43     for(int i = 0 ;i < len;i++)
44     {
45        if(str[i] == '1')
46        {
47           lb ++ ; 
48           b[lb] = i + 1; 
49        }
50     }
51     memset(dp,-1,sizeof(dp));
52     dp[0][0][0] = 0;
53     for(int i =1;i<= m;i ++)
54     {
55        for(int j = 0;j <= 10;j ++)
56          for(int k = 0 ;k <= 10 ;k ++)
57          {
58             if(dp[i-1][j][k] != -1 )
59             {
60              //printf("%d %d %d\n",i,j,k);
61                  for(int s = 1;s <= lb ;s ++ )
62                  {
63                    if(b[s] > j && b[s] != k)
64                    {
65                        dp[i][b[s]-j][b[s]] = k ;
66                        //printf("***%d %d %d\n",i,b[s]-j,b[s]);
67                    }
68                  }
69             }
70          }
71     }
72     for(int i = 1 ;i <= 10;i ++)
73     {
74         for(int j = 1;j <= 10;j ++)
75         {
76            if(dp[m][i][j] != -1 )
77            {
78              printf("YES\n");
79              dfs(m,i,j);
80              return 0;
81            }
82         }
83     }
84      printf("NO\n") ;
85 return 0;
86 }
View Code

 

posted on 2014-08-03 17:10  dark_dream  阅读(7342)  评论(0编辑  收藏  举报