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;
   }
};

 

原文地址:https://www.cnblogs.com/forgot93/p/4287229.html