首页 > 代码库 > topcoder 643 DIV2
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-10^6的素数刷选。
留下的n!=1的也是素数。保存的数再排序。
C:题给跪了,
看的出来时比较简单的题目,比以前的题目都要简单,可就是想不出。
看看别人的代码,只剩下ORZ。
1 #include <string> 2 #include <vector> 3 #include<iostream> 4 #include<string.h> 5 #include<algorithm> 6 #include<cmath> 7 8 using namespace std; 9 10 typedef long long ll;11 int dp[55][55][55];12 int b[55][55][55];13 14 vector<int>mp[123];15 #define inf 0x3f3f3f16 int n;17 int son[123];18 19 class TheKingsTree {20 public:21 22 23 int dfs(int u,int red,int green)24 {25 if (b[u][red][green]) return dp[u][red][green];26 27 b[u][red][green]=1;28 int c1=red+1;29 int c2=green+1;30 for (int i=0;i<mp[u].size();i++)31 {32 c1+=dfs(mp[u][i],red+1,green);33 c2+=dfs(mp[u][i],red,green+1);34 }35 return dp[u][red][green]=min(c1,c2);36 }37 int getNumber(vector <int> parent) {38 for (int i=0;i<parent.size();i++)39 mp[parent[i]].push_back(i+1);40 41 return dfs(0,0,0);42 }43 };44 45 46 // Powered by FileEdit47 // Powered by TZTester 1.01 [25-Feb-2003]48 // Powered by CodeProcessor
我把我理解的大概写一下:
DFS(0,0,0)是从节点0开始遍历 且其子节点red=0,green=0;
还要记录状态是否保存了。记忆花搜索
c1=red+1;(采用的是一种我认为的倒序方式)
当前节点为red 然后要加上其值,
c1+=dfs(v,red+1,green);
是把v染成red的值。c1要加上其值。
C2是代表green 依次类推
PS:这种方程在比赛中时怎么也写不出来的。
topcoder 643 DIV2
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。