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
    没有梦想,何谈远方
  • 相关阅读:
    2019春招面试题总结-03
    2019春招面试题总结-02
    2019春招面试题总结-01
    Node.js 全局对象
    Node.js 路由
    Node.js 函数
    Node.js 模块系统
    Node.js Stream(流)
    Node.js Buffer(缓冲区)
    Node.js EventEmitter
  • 原文地址:https://www.cnblogs.com/zyue/p/3888589.html
Copyright © 2011-2022 走看看