• topcoder 649 DIV2


      A:模拟

      9:B:终于看懂题目。。。

        题意:最多分解K次

                每分钟一个数可以分解成两个数 或者-1;

         关键字:DP,记忆花搜索。

         DP[I][J]=min(dp[i][j],1+max(dp[ii][jj],dp[i-ii][j-jj-1]);

          1 #include<iostream>

     2 #include <string>
     3 #include <vector>
     4 #include<cmath>
     5 #include <string.h>
     6 using namespace std;
     7 int dp[123][123];
     8 class CartInSupermarketEasy {
     9     public:
    10 
    11 
    12     int dfs(int n,int k)
    13     {
    14         if (dp[n][k]!=-1return dp[n][k];
    15         if (n==0return 0;
    16         if (k==0return n;
    17         if (n==1return 1;
    18         int ans=dfs(n-1,k)+1;
    19         for (int i=1;i<=n;i++)
    20         for (int j=0;j<k;j++)
    21         {
    22             ans=min(ans,1+ max(dfs(i,j),dfs(n-i,k-j-1)));
    23         }
    24         dp[n][k]=ans;
    25         return dp[n][k];
    26     }
    27     int calc(int N, int K) {
    28     memset(dp,-1,sizeof(dp));
    29     return dfs(N,K);
    30     }
    31    // int t=round(log(N)/log(2))
    32 };
    33 
    34 int main()
    35 {
    36     CartInSupermarketEasy  p;
    37     int n,k;
    38     cin>>n>>k;
    39     cout<<p.calc(n,k);
    40     return 0;
    41 }
    42 
    43 // Powered by FileEdit
    44 // Powered by TZTester 1.01 [25-Feb-2003]
    45 // Powered by CodeProcessor

    10:C

      关键字:贪心;

    先联想成二进制。

    有这样一个性质:我们这样考虑,比如一个N 最大是:100000;

    然后我们这样枚举:100000 10000 1000 100 10 1 0

    因为如果100000产生的答案更大的话接下来枚举10000

    而两者不矛盾 逐次枚举使答案更大

    #include<iostream>
    #include<string.h>
    #include <string>
    #include <vector>
    using namespace std;
    class XorSequenceEasy {
    public:
    int getmax(vector <int> A, int N) {
        int n=A.size();
        int ans=0;
        for (int k=N;k;k>>=1)
        {
           int cnt1=0;
           for (int i=0;i<n;i++)
                for (int j=i+1;j<n;j++)
                if (A[j]>A[i]) cnt1++;
            for (int i=0;i<n;i++) A[i]^=k;
             int cnt2=0;
              for (int i=0;i<n;i++)
                for (int j=i+1;j<n;j++)
                if (A[j]>A[i]) cnt2++;
                ans=max(ans,max(cnt1,cnt2));
                if (cnt1>cnt2)  for (int i=0;i<n;i++) A[i]^=k;
        }
        return ans;
       }
    };

     

  • 相关阅读:
    单机部署Fastfds+nginx
    day_ha配置文件
    day_1_登录接口

    表(list)
    Java基础01 ------ 从HelloWorld到面向对象
    测试V模型
    360极速模式和兼容模式区别
    初识VBS
    Bug描述规范
  • 原文地址:https://www.cnblogs.com/forgot93/p/4287229.html
Copyright © 2020-2023  润新知