SRM 583 DIV1
A
裸最短路.
![](/assets/blank.gif)
![](/assets/blank.gif)
1 class TravelOnMars { 2 public: 3 int minTimes(vector <int>, int, int); 4 }; 5 vector<int> e[maxn]; 6 int n; 7 8 int dist(int a,int b) { 9 if (a>b) swap(a,b); 10 int res = min( b-a , a+n-b); 11 return res; 12 } 13 int d[maxn],inq[maxn]; 14 queue<int> q; 15 int bfs(int s,int t) { 16 for (int i=0 ; i<n ; i++ ) d[i] = 1000; 17 d[s] = 0; 18 inq[s] = true; 19 q.push(s); 20 while (!q.empty()) { 21 int cur = q.front(); q.pop(); 22 printf("d[%d]:%d\n",cur,d[cur]); 23 inq[cur] = false; 24 for (int i=0 ; i<(int)e[cur].size() ; i++ ) { 25 int v = e[cur][i]; 26 if (d[v]>d[cur]+1) { 27 d[v] = d[cur]+1; 28 if (!inq[v]) { 29 inq[v] = true; 30 q.push(v); 31 } 32 } 33 } 34 } 35 return d[t]; 36 } 37 int TravelOnMars::minTimes(vector <int> range, int startCity, int endCity) { 38 n = range.size(); 39 printf("n=%d\n",n); 40 for (int i=0 ; i<n ; i++ ) { 41 for (int j=0 ; j<n ; j++ ) if (dist(i,j)<=range[i]) { 42 e[i].push_back(j); 43 } 44 } 45 int ans = bfs(startCity,endCity); 46 return ans; 47 }
View Code
B
f(u,s)表示以u为根子树的答案 , s=1表示有从u祖先下来的路径 , s=0表示没有.
f(u,s) 可以通过一个dp得到 :
dp[i][size]表示现在考虑第u的i个孩子,当前已经向下连了size条边时的最小代价 , 答案就是min(dp[ cntson ] [ size ] ),
然后需要加一些强制转移.
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include <vector> 2 #include <list> 3 #include <map> 4 #include <set> 5 #include <deque> 6 #include <stack> 7 #include <bitset> 8 #include <algorithm> 9 #include <functional> 10 #include <numeric> 11 #include <utility> 12 #include <sstream> 13 #include <iostream> 14 #include <iomanip> 15 #include <cstdio> 16 #include <cmath> 17 #include <cstdlib> 18 #include <ctime> 19 #include <cstring> 20 using namespace std; 21 #define maxn 55 22 class TurnOnLamps { 23 public: 24 int minimize(vector <int>, string, string); 25 }; 26 struct edge{ 27 int v,c; 28 }; 29 30 vector<edge> e[maxn]; 31 bool debug; 32 int var[maxn],n,dp[maxn][2],dp2[2][maxn][maxn]; 33 int getvar(int x) { 34 if (x<0) return 0; 35 int res = x/2 + (x&1); 36 if (debug) printf("var:%d = %d\n",x,res); 37 return res; 38 } 39 int better(int a,int b) { 40 if (a==-1) return b; 41 if (b==-1) return a; 42 return min(a,b); 43 } 44 int dfs(int u,int s,int fa) { 45 if (dp[u][s]!=-1) return dp[u][s]; 46 vector<edge> son; 47 for (int i=0 ; i<(int)e[u].size() ; i++ ) { 48 int v = e[u][i].v; 49 if (v==fa) continue; 50 son.push_back(e[u][i]); 51 dfs(v,0,u); 52 dfs(v,1,u); 53 } 54 debug = (u==10); 55 printf("u:%d s:%d debug=%d\n",u,s,debug); 56 for (int i=0 ; i<(int)e[u].size() ; i++ ) if (e[u][i].v != fa) { 57 printf("son:%d c:%d\n",e[u][i].v,e[u][i].c); 58 } 59 // {{0, 1, 0, 2, 0, 1, 1, 2, 4, 6, 10, 10, 11, 10, 9, 9, 10, 15, 7}, "0111100111001010000", "0100001100101000111"} 60 int res = 0; 61 // for (int i=0 ; i<son.size() ; i++ ) printf("%d %d\n",son[i].v,son[i].c); 62 if (son.size()) { 63 if (son[0].c==0) { 64 dp2[s][son[0].v][0] = dp[son[0].v][0]; 65 dp2[s][son[0].v][1] = dp[son[0].v][1] + getvar(1-s); 66 } else if (son[0].c==1) { 67 dp2[s][son[0].v][1] = dp[son[0].v][1] + getvar(1-s); 68 } else if (son[0].c==2) { 69 dp2[s][son[0].v][0] = dp[son[0].v][0]; 70 } 71 for (int i=1 ; i<(int)son.size() ; i++ ) { 72 int lastv = son[i-1].v; 73 int v = son[i].v; 74 int c = son[i].c; 75 for (int j=0 ; j<=i ; j++ ) if (dp2[s][lastv][j] != -1) { 76 if (u==10) printf("dp2[%d][%d][%d]=%d\n",s,lastv,j,dp2[s][lastv][j]); 77 // printf("dp2[%d][%d]=%d\n",lastv,j,dp2[lastv][j]); 78 if (c == 0) { 79 int tmp; 80 tmp = better(dp2[s][v][j] , dp2[s][lastv][j]+dp[v][0]); 81 // if (u==10) printf("update: dp2[%d][%d][%d] from %d to %d\n",s,v,j,dp2[s][v][j],tmp); 82 dp2[s][v][j] = tmp; 83 tmp = better(dp2[s][v][j+1] , dp2[s][lastv][j]-getvar(j-s)+dp[v][1]+getvar(j+1-s)); 84 // if (u==10) printf("update: dp2[%d][%d][%d] from %d to %d\n",s,v,j+1,dp2[s][v][j+1],tmp); 85 dp2[s][v][j+1] = tmp; 86 } else if (c == 1) { 87 int tmp = better(dp2[s][v][j+1] , dp2[s][lastv][j]-getvar(j-s)+dp[v][1]+getvar(j+1-s)); 88 // if (u==10) printf("update: dp2[%d][%d][%d] from %d to %d\n",s,v,j+1,dp2[s][v][j+1],tmp); 89 dp2[s][v][j+1] = tmp; 90 } else if (c == 2) { 91 int tmp = dp2[s][v][j] = better(dp2[s][v][j] , dp2[s][lastv][j]+dp[v][0]); 92 // if (u==10) printf("update: dp2[%d][%d][%d] from %d to %d\n",s,v,j,dp2[s][v][j],tmp); 93 dp2[s][v][j] = tmp; 94 } 95 } 96 } 97 int smlcost = -1; 98 int v = son[son.size()-1].v; 99 for (int i=0 ; i<=(int)son.size() ; i++ ) 100 if (dp2[s][v][i]!=-1) { 101 smlcost = better(smlcost , dp2[s][v][i]); 102 } 103 // if (smlcost != -1) res = smlcost; 104 res = smlcost; 105 } 106 printf("dp[%d][%d]=%d\n",u,s,res); 107 return dp[u][s] = res; 108 } 109 int TurnOnLamps::minimize(vector <int> roads, string init, string imp) { 110 n = roads.size()+1; 111 for (int i=0 ; i<n-1 ; i++ ) { 112 e[i+1].push_back((edge){roads[i],imp[i]=='1'?imp[i]-'0'+init[i]-'0':0}); 113 e[roads[i]].push_back((edge){i+1,imp[i]=='1'?imp[i]-'0'+init[i]-'0':0}); 114 } 115 memset(dp,-1,sizeof(dp)); 116 memset(dp2,-1,sizeof(dp2)); 117 int ans = dfs(0,0,-1); 118 return ans; 119 }
View Code
C
概率题好费脑筋啊。。
模拟样例算不对 , 后来发现是少算了转移到自己的情况 , 然后就不会做了: 考虑每次能转移到自己的情况会出现无数步 , 怎么计算期望就成了问题;
题解在这个问题上处理地很巧妙 :
(1) 从期望的公式出发,推导得到了一个简单的形式 : sum ( 第i步没有完成的概率 ) (0<=i <INF);
(2) 可以用容斥来计算第i步没有完成的概率;
(3) 将容斥的公式变形 , 得到一系列的收敛的无穷级数 , 于是解决了i有无穷多的问题;
最后就得到了一个简单的统计模型: 对于给定的值x , 求有多少个元素个数为奇数的集合sum为x , 和有多少个个数为偶数的集合sum为x , 求他们的差,递推即可.
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #define maxn 2000 2 class RandomPaintingOnABoard { 3 public: 4 double expectedSteps(vector <string>); 5 }; 6 int cnt[maxn],sum[maxn],n,m,f[30][maxn],tot; 7 double RandomPaintingOnABoard::expectedSteps(vector <string> prob) { 8 n = prob.size(); 9 m = prob[0].size(); 10 vector<string> tmp; 11 if (m>n) { 12 for (int i=0 ; i<m ; i++ ) { 13 string s = ""; 14 for (int j=0 ; j<n ; j++ ) s += prob[j][i]; 15 tmp.push_back(s); 16 } 17 prob = tmp; 18 swap (n,m); 19 for (int i=0 ; i<n ; i++ ) cout<<prob[i]<<endl; 20 } 21 double ans = 0; 22 printf("n:%d m:%d\n",n,m); 23 for (int i=0 ; i<n ; i++ ) for (int j=0 ; j<m ; j++ ) tot += prob[i][j]-'0'; 24 for (int i=0 ; i<(1<<m) ; i++ ) { 25 26 // for (int j=0 ; j<n ; j++ ) sum[j] = 0; 27 // for (int j=0 ; j<n ; j++ ) for (int k=0 ; k<=tot ; k++ ) f[j][k] = 0; 28 memset(sum,0,sizeof(sum)); 29 memset(f,0,sizeof(f)); 30 31 for (int j=0 ; j<n ; j++ ) for (int k=0 ; k<m ; k++ ) if (((i>>k)&1)==0) { 32 sum[j] += prob[j][k]-'0'; 33 } 34 f[0][0] = -1; 35 for (int j=0 ; j<m ; j++ ) if ((i>>j)&1) f[0][0] *= -1; 36 for (int j=0 ; j<n ; j++ ) for (int k=0 ; k<=tot ; k++ ) { 37 f[j+1][k] -= f[j][k]; 38 if (k+sum[j]<=tot) f[j+1][k+sum[j]] += f[j][k]; 39 } 40 for (int j=0 ; j<tot ; j++ ) cnt[j] += f[n][j]; 41 } 42 for (int i=0 ; i<tot ; i++ ) { 43 ans += (double)cnt[i] * ((double)tot/(double)(tot-i)); 44 } 45 return ans; 46 } 47 48 49 //Powered by [KawigiEdit] 2.0!
View Code
(http://apps.topcoder.com/wiki/display/tc/SRM+583)
转载于:https://www.cnblogs.com/eggeek/p/3544234.html
SRM 583 DIV1相关推荐
- TC SRM 655 Div1 Level 3 题解
TC SRM 655 Div1 Level 3 题解 题目传送门 dp+几何 首先可以发现凸包是顺时针排列的一些线段构成的.我们可以预处理每一个蓝点是否都在一个线段 r [ i ] → r [ j ] ...
- SRM 590 DIV1
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 水水更健康,终于回到1800+了... DIV2 ...
- topcoder srm 691 div1 -3
1.给定一个$n$个顶点$n$个边的图,边是$(i,a_{i})$,顶点编号$[0,n-1]$.增加一个顶点$n$,现在选出一个顶点集$M$,对于任意的在$M$中 的顶点$x$,去掉边$(x,a_{x ...
- SRM 563 Div1 500 SpellCards
Description 有n张符卡排成一个队列,每张符卡有两个属性,等级lili和伤害didi. 你可以做任意次操作,每次操作为以下二者之一: 把队首的符卡移动到队尾. 使用队首的符卡,对敌人造成di ...
- topcoder srm 706 div1
1.给定一个迷宫,点号表示不可行,井号表示可行.现在可以改变其中的一些井号的位置.问最少改变多少个井号可以使得从左上角到右下角存在路径. 思路:设高为$n$,宽为$m$,若井号的个数$S$小于$n+m ...
- topcoder srm 694 div1 -3
1.给出$n$个数字,将其分成三个非空的组,每组的权值为该组所有数字的抑或.选择一种分法使得三组的权值和最大? 思路:记录前两组的权值且三组有没有数字时第三组的值.(当前两组的值知道时第三组的权值是确 ...
- topcoder srm 330 div1
problem1 link 直接模拟. import java.util.*; import java.math.*; import static java.lang.Math.*;public cl ...
- topcoder srm 360 div1
problem1 link (1)$n \neq m$时,假设$n<m$,那么同一行中的$m$个数字必定都相等. (2)$n=m$时,要满足任意的$i_{1},i_{2},j_{1},j_{2} ...
- topcoder srm 635 div1
problem1 link 首先枚举长度$L$.然后计算每一段长度$L$的差值最大公约数,然后差值除以最大公约数的结果可以作为当前段的关键字.然后不同段就可以比较他们的关键字,一样就是可以转化的. p ...
最新文章
- 绝对布局优势_遇上狭长型卫生间基本没救?2种布局教会你,什么叫美观实用兼具...
- Privoxy shadowscocks代理
- SQL错误提示档案(3):SQL Server连接中的四个最常见错误
- QListWidget读取本地文件夹中文件并显示名字,双击读取xml数据
- Windows Phone 7 浏览器打开新窗口问题
- SOC/LM在台湾的2011年发展趋势研判
- php中fread()函数,php fread()函数
- 北方民族大学计算机全国排名,校友会:全国15所民族类大学排名,这三所大学进入十强...
- eclipse导出war包放入服务器中
- 超级电容怎么才能把内阻做小_内置超级电容汽车熄火仍可工作,韩国AHL车载无线充内藏重器...
- 谈谈互动型网站中垃圾贴的应对方案,互联网营销
- python成绩统计_巧用python对学生成绩计算总分并排序
- 马蹄疾 | 2019年,是时候认真学一波 Grid 布局了
- 蜂鸟E200(3)乱序、反压、流水线冲突
- 自建服务器打印机,打印机服务器搭建 -cups
- RSA加密算法(C语言实现)
- 并行insert出现library cache lock与cursor: pin S wait on X等待问题记录
- 214情人节,使用微信小程序【信鸽相知】写情书吧
- 2020-10-13 WPS VBA 添加控件,显示“库没有注册”
- idea导包失败解决