A

  裸最短路.

  

 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 ] ),

  然后需要加一些强制转移.

  

  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 , 求他们的差,递推即可.

 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相关推荐

  1. TC SRM 655 Div1 Level 3 题解

    TC SRM 655 Div1 Level 3 题解 题目传送门 dp+几何 首先可以发现凸包是顺时针排列的一些线段构成的.我们可以预处理每一个蓝点是否都在一个线段 r [ i ] → r [ j ] ...

  2. SRM 590 DIV1

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 水水更健康,终于回到1800+了... DIV2 ...

  3. topcoder srm 691 div1 -3

    1.给定一个$n$个顶点$n$个边的图,边是$(i,a_{i})$,顶点编号$[0,n-1]$.增加一个顶点$n$,现在选出一个顶点集$M$,对于任意的在$M$中 的顶点$x$,去掉边$(x,a_{x ...

  4. SRM 563 Div1 500 SpellCards

    Description 有n张符卡排成一个队列,每张符卡有两个属性,等级lili和伤害didi. 你可以做任意次操作,每次操作为以下二者之一: 把队首的符卡移动到队尾. 使用队首的符卡,对敌人造成di ...

  5. topcoder srm 706 div1

    1.给定一个迷宫,点号表示不可行,井号表示可行.现在可以改变其中的一些井号的位置.问最少改变多少个井号可以使得从左上角到右下角存在路径. 思路:设高为$n$,宽为$m$,若井号的个数$S$小于$n+m ...

  6. topcoder srm 694 div1 -3

    1.给出$n$个数字,将其分成三个非空的组,每组的权值为该组所有数字的抑或.选择一种分法使得三组的权值和最大? 思路:记录前两组的权值且三组有没有数字时第三组的值.(当前两组的值知道时第三组的权值是确 ...

  7. topcoder srm 330 div1

    problem1 link 直接模拟. import java.util.*; import java.math.*; import static java.lang.Math.*;public cl ...

  8. topcoder srm 360 div1

    problem1 link (1)$n \neq m$时,假设$n<m$,那么同一行中的$m$个数字必定都相等. (2)$n=m$时,要满足任意的$i_{1},i_{2},j_{1},j_{2} ...

  9. topcoder srm 635 div1

    problem1 link 首先枚举长度$L$.然后计算每一段长度$L$的差值最大公约数,然后差值除以最大公约数的结果可以作为当前段的关键字.然后不同段就可以比较他们的关键字,一样就是可以转化的. p ...

最新文章

  1. 绝对布局优势_遇上狭长型卫生间基本没救?2种布局教会你,什么叫美观实用兼具...
  2. Privoxy shadowscocks代理
  3. SQL错误提示档案(3):SQL Server连接中的四个最常见错误
  4. QListWidget读取本地文件夹中文件并显示名字,双击读取xml数据
  5. Windows Phone 7 浏览器打开新窗口问题
  6. SOC/LM在台湾的2011年发展趋势研判
  7. php中fread()函数,php fread()函数
  8. 北方民族大学计算机全国排名,校友会:全国15所民族类大学排名,这三所大学进入十强...
  9. eclipse导出war包放入服务器中
  10. 超级电容怎么才能把内阻做小_内置超级电容汽车熄火仍可工作,韩国AHL车载无线充内藏重器...
  11. 谈谈互动型网站中垃圾贴的应对方案,互联网营销
  12. python成绩统计_巧用python对学生成绩计算总分并排序
  13. 马蹄疾 | 2019年,是时候认真学一波 Grid 布局了
  14. 蜂鸟E200(3)乱序、反压、流水线冲突
  15. 自建服务器打印机,打印机服务器搭建 -cups
  16. RSA加密算法(C语言实现)
  17. 并行insert出现library cache lock与cursor: pin S wait on X等待问题记录
  18. 214情人节,使用微信小程序【信鸽相知】写情书吧
  19. 2020-10-13 WPS VBA 添加控件,显示“库没有注册”
  20. idea导包失败解决

热门文章

  1. 探索ElasticSearch(一)
  2. [Git] 还原Git上commit,但是没有push代码
  3. Hadoop项目实战-用户行为分析之应用概述(二)
  4. 在Windows下使用MinGW静态编译Assimp
  5. 获得MFC窗口其它类指针的方法
  6. 我的KT库之-----扩展方法
  7. WinDBG工具简介(.net大会中张银奎先生介绍)
  8. 还是两个数的交换问题
  9. 微信小程序开发遇到的那些“坑”(1.2.0-1.4.0)
  10. 目前的计算机还没有实现真正的智能