zoukankan      html  css  js  c++  java
  • codeforces339C

    题意:给你无穷多个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
    ") ;
    65      for(int i =1 ;i <= m;i ++)
    66          printf("%d ",ans[i]);
    67    }else{
    68      printf("NO
    ");
    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
    ",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
    ",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
    ");
    79              dfs(m,i,j);
    80              return 0;
    81            }
    82         }
    83     }
    84      printf("NO
    ") ;
    85 return 0;
    86 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    POJ 2018 二分
    873. Length of Longest Fibonacci Subsequence
    847. Shortest Path Visiting All Nodes
    838. Push Dominoes
    813. Largest Sum of Averages
    801. Minimum Swaps To Make Sequences Increasing
    790. Domino and Tromino Tiling
    764. Largest Plus Sign
    Weekly Contest 128
    746. Min Cost Climbing Stairs
  • 原文地址:https://www.cnblogs.com/zyue/p/3888589.html
Copyright © 2011-2022 走看看