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

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;

}

};

时间: 2024-10-14 05:43:23

topcoder 649 DIV2的相关文章

topcoder SRM628 div2 500(转)

Problem Statement      We have three types of brackets: "()", "[]", and "{}". We are now interested in some special strings. A string is special if all the following conditions hold: Each character of the string is one of the

TopCoder 649 div1 &amp; div2

最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实补题吧. div2 250pts 题意:判断s去掉一个字符后能否和t一样. 代码: 1 class DecipherabilityEasy { 2 public: 3 string check(string s, string t) { 4 int n = s.size(); 5 int m = t

Topcoder SRM632 DIV2 解题报告

250:乱搞 解题代码: 1 // BEGIN CUT HERE 2 /* 3 4 */ 5 // END CUT HERE 6 #line 7 "RunningAroundPark.cpp" 7 #include <cstdlib> 8 #include <cctype> 9 #include <cstring> 10 #include <cstdio> 11 #include <cmath> 12 #include <

[Topcoder]SRM632 div2 题解

TC第一次解出三题--当了次room leader-- 感觉这次的题比较弱,代码量也很小,都是在拼手速了 250 RunningAroundPark 题意很好懂,一圈跑道上有N棵树,现给你遇到这些树的顺序,问最少需要多少走圈才能遇到相应的序列 直接判断a[i]<=a[i+1]即可 首先假定走了一圈 #include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #inc

Topcoder SRM631 DIV2 解题报告

250:网格有两种颜色,网格中一列最长的连续的颜色相同的最大值. 解题思路:暴力. 解题代码: // BEGIN CUT HERE /* */ // END CUT HERE #line 7 "TaroGrid.cpp" #include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #include <cmath> #include <

topcoder 643 DIV2

太弱了,太弱了! A:基本的判断吧,然后就是边界问题,写了好久,结果发现时房间第二个交的.. B:真心跪了,还好想出来了,思路想的太慢太慢,结果交上去,落后太多,不过HACK时很多人挂了, 这也是DIV1的A题.做法是: 如果对于一个long long 的数质因数分解师很难做到的. 但是题目告诉了m/2个数,m是分解后质因数的个数. 然后我们想先刷法求出1-10^6的质因数. 如果n有大于10^6的质因数最多2个(n<=10^18)对吧. 然后已经写出了1个,一定会写出一个. 所以 我们对其用1

Topcoder SRM633 DIV2 解题报告

250:乱搞. 1 // BEGIN CUT HERE 2 /* 3 4 */ 5 // END CUT HERE 6 #line 7 "Target.cpp" 7 #include <cstdlib> 8 #include <cctype> 9 #include <cstring> 10 #include <cstdio> 11 #include <cmath> 12 #include <algorithm> 1

Topcoder SRM655 DIV2 950 NineEasy 状压 + 数位 dp

题意:要你构造一个n位的数子 ,给你m(1-5)个询问,每一次询问取一些位数的数组成一个新数且这个数 %9 ==  0 , 问你要满足这m个询问的数字有多少个(允许前缀0). 解题思路:把每一种情况状压,得到一个最多  9x9x9x9x9 的情况,然后根据 每个数的询问决定状态转移方程. 解题代码: 1 // BEGIN CUT HERE 2 /* 3 4 */ 5 // END CUT HERE 6 #line 7 "NineEasy.cpp" 7 #include <cstd

ACM学习历程—TopCoder SRM691 Div2

这是我的第一次打TC,感觉打的一般般吧.不过TC的题目确实挺有意思的. 由于是用客户端打的,所以就不发题目地址了. 300分的题: 这题大意是有一段序列只包含+和数字0~9. 一段序列的操作是,从头扫到尾,遇到+就对计数器+1.遇到数字就计算abs(num-count)的值,并加到sum中. 题目要求重新排序序列,使得sum最小. 由于是abs,最小值自然是0,于是就是要构造0. 由于计数器只会网上增,所以数字我肯定从小到大排,于是对于某个数,计数器不足这个数,那么就需要增加计数器,否则就计算a