topcoder 649 DIV2
8
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]!=-1) return dp[n][k];
15 if (n==0) return 0;
16 if (k==0) return n;
17 if (n==1) return 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
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]!=-1) return dp[n][k];
15 if (n==0) return 0;
16 if (k==0) return n;
17 if (n==1) return 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;
}
};
随性Code