A - Arcade Game

题意:给一个小于9位且每一位各不相同的数字,一次可以让这个数字的所有位重新排列,如果获得的排列是所有排列的最大情况则获胜,否则如果大于当前数字则可继续游戏,直到获胜或失败。

题解:直接用组合数做肯定会超时,可以通过推式子的方式推出所有情况

首先求出当前位数一共有多少种排列情况n,并求出在所有排列情况中大于给出数字的数量sum。则一次到达最大值的概率为n!(n−0)!∗0!∗1n\frac{n!}{(n-0)!*0!}*\frac{1}{n}(n−0)!∗0!n!​∗n1​,第二次到达最大值的概率为n!(n−1)!∗1!∗1n∗n\frac{n!}{(n-1)!*1!}*\frac{1}{n*n}(n−1)!∗1!n!​∗n∗n1​可以看到两项之间仅差n−11∗n\frac{n-1}{1*n}1∗nn−1​,故可以通过递推式找到每一种情况,相加求和即为索求答案

代码:

#include <bits/stdc++.h>using namespace std;
const int N = 1e5 + 10;
const int M = 1e6 + 10;
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-3;
int a[20], b[20];
int len = 0;
bool check(){for(int i = 0;i<len;i++)    if(a[i]!=b[i])  return false;return true;
}
void solve(){int n;cin>>n;len = 0;while(n){a[len++] = n%10;n/=10;}int sum = 0;for(int i = 0;i<len;i++){b[len-i-1] = a[i];}for(int i = 0;i<len;i++)    a[i] = b[i];int flag = 0;n = 0;sort(a, a + len);if (!flag) {if (check()) {flag = 1;}}while(next_permutation(a,a+len)){if(flag)    sum++;if(!flag){if(check()) flag = 1;}n++;}double ans;n++;if(sum==0)  ans = 0;else    ans = 1.0/n;double now = ans;for(int i = 1;i<sum;i++){now = now*(sum-i)*1.0/i*1.0/n;ans += now;}printf("%.9f\n",ans);
}
int main(){int t;cin >> t;while(t--){solve();}return 0;
}

C - Connecting Graph

题意:有两个操作,第一个操作在第i秒时连接u和v,第二个操作询问u和v最早的联通时间,如果未联通则输出-1

题解:连边操作可以考虑使用并查集进行查询,如果两点未联通即两点不在同一并查集中则令两点所在并查集连接到一起,并令边权为当前时间。同时查询操作可以存储下来查询的时间和两点,最后当图建完后对每一次询问使用倍增LCA快速查找uv之间路径上的时间最大值,并判断输出答案。

#include <bits/stdc++.h>using namespace std;
const int N = 1e5 + 10;
const int M = 1e6 + 10;
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-3;
struct node{int u,v,w,next;
}a[M];
int f[N],cnt;
void add(int u,int v,int w){a[++cnt].v = v;a[cnt].w = w;a[cnt].next = f[u];f[u] = cnt;
}
int lg;
int father[N][30],root[N],Time[N][30],dep[N];
int lca(int u,int v){int x = u,y = v;if(dep[u] < dep[v]) swap(u,v);int Max = 0;for(int i = lg;i>=0;i--){if(dep[father[u][i]] >= dep[v]) {Max = max(Max,Time[u][i]);u = father[u][i];}}if(u==v)    return Max;for(int i = lg;i>=0;i--){if(father[u][i]!=father[v][i]){Max = max(Max,max(Time[u][i],Time[v][i]));u = father[u][i],v = father[v][i];}}return max(Max,max(Time[u][0],Time[v][0]));
}
void dfs(int u,int fa){for (int j = 1; j <= lg; j++) {father[u][j] = father[father[u][j - 1]][j - 1];Time[u][j] = max(Time[u][j - 1], Time[father[u][j - 1]][j - 1]);}for(int i = f[u];i;i = a[i].next){int v = a[i].v,w = a[i].w;if(v==fa)   continue;dep[v] = dep[u] + 1;father[v][0] = u;Time[v][0] = w;dfs(v,u);}
}
int c[N];
int getf(int v){if(c[v]==v) return v;else    return c[v] = getf(c[v]);
}
void solve(){cnt = 0;memset(f,0,sizeof f);int n,m;cin>>n>>m;for(int i = 1;i<=n;i++) c[i] = i;lg = (int)(log(n)/log(2))+1;int type,u,v;vector<pair<int,pair<int,int>>> query;for(int i = 1;i<=m;i++){scanf("%d%d%d",&type,&u,&v);if(type==1){int id1 = getf(u),id2 = getf(v);if(id1==id2)    continue;c[id1] = id2;add(id1, id2, i);add(id2,id1,i);}else{query.push_back({i,{u,v}});}}for(int i =1;i<=n;i++)  if(c[i]==i){father[i][0] = i;Time[i][0] = 0;dep[i] = 0;dfs(i,-1);}for(auto it:query){int t = it.first,u = it.second.first,v = it.second.second;if(u==v) puts("0");else{int t1 = getf(u),t2 = getf(v);if(t1!=t2)  puts("-1");else{int res = lca(u,v);printf("%d\n",res>t?-1:res);}} }
}
int main(){int t;cin >> t;while(t--){solve();}return 0;
}

L - Candy Jars

题意:给出n个罐子,每个罐子里装有一定数量的糖,每次选择一个罐子,扔掉其余所有糖,并将选择罐子里的糖分到所有罐子里使得所有罐子里都不为空。不能分配糖的人输。

题解:第一种情况当所有罐子里的糖都不够n个罐子分也就是小于n的时候,先手必输。当存在糖数可以使得分完后任意罐子都小于n则先手必赢。即存在ai<=n∗(n−1)a_i<=n*(n-1)ai​<=n∗(n−1)。当ai>n∗(n−1)a_i>n*(n-1)ai​>n∗(n−1)时由于此时先手无论怎么分,都必然存在分完后的ai<=n∗(n−1)且ai>=na_i<=n*(n-1)且a_i>=nai​<=n∗(n−1)且ai​>=n即分完后先手必赢,即该游戏先手必输。归纳可得如果存在n<=ain<=a_in<=ai​%n∗(n−1)<n∗(n−1)n*(n-1)<n*(n-1)n∗(n−1)<n∗(n−1)则先手赢,否则后手赢。

#include <bits/stdc++.h>using namespace std;
const int N = 1e5 + 10;
const int M = 1e6 + 10;
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-3;void solve(){int n;cin>>n;int flag = 0;for(int i = 1;i<=n;i++){int x;scanf("%d",&x);int w = x%((n-1)*n);if(w>=n||w==0){flag = 1;}}if(flag)    puts("Alice");else    puts("Bob");
}
int main(){int t;cin >> t;while(t--){solve();}return 0;
}

ECPC-2015部分题解相关推荐

  1. TJOI 2015 弦论 题解

    题目传送门 题目大意: 求出一个字符串第 kkk 小的子串是谁. 题解 建出SAM,求出 sizesizesize 数组,即每个状态的 endposendposendpos 集大小,如果 t=0t=0 ...

  2. BZOJ3938 UOJ88:[集训队互测2015]Robot——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3938 http://uoj.ac/problem/88 小q有n只机器人,一开始他把机器人放在了一 ...

  3. 2015浙江财经大学ACM有奖周赛(一) 题解报告

    2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...

  4. 2015年第六届蓝桥杯本科B组C++省赛个人题解

    比赛结束已经一星期了,成绩也出来了,江苏非211组的省前十,但是深感自己还是有太多的不足.绝对不能以自己还只是大一为借口,acm这条路还长的很. 目测得了95分(满分150),第一题错了,代码填空第一 ...

  5. 2015 ACM/ICPC Asia Regional Shenyang Online题解

    以下所有AC题解程序来自"仙客传奇"团队. AC题数:7/13 ABCFGJL A. Traversal AC的C++语言程序: #include <bits/stdc++. ...

  6. ccf-csp 2015春季真题题解

    图像旋转 问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可. 输入格式 输入的 ...

  7. ccf-csp 2015秋季真题题解

    数列分段 问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? 输入格式 输入的第一行包含一个整数n,表示数列中整数的个数. 第二行包含n个整数a1, a2, -, ...

  8. 2015武汉大学第八届Eming杯现场赛E题题解

    题目大意: 就是现在空间中给定球,平面和点的位置, 从点的位置作为点光源散发出光求球在平面上的投影面积. 大致思路: 本题并没有用到复杂的算法, 但是对于一些数学上的几何知识提出了一定的要求, 投影如 ...

  9. 2015年蓝桥杯省赛C++B组真题与题解

    1 奖券数目 题目: 有些人很迷信数字,比如带"4"的数字,认为和"死"谐音,就觉得不吉利. 虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖 ...

  10. 蓝桥杯2015年第六届C/C++ B组省赛习题题解

    目录 第一题:奖券数目 第二题:星系炸弹(日期计算) 第三题:三羊献瑞(全排列) 第四题:格子中输出 第五题:九数组分数(dfs) 第六题:加法变乘法(枚举) 第七题:牌型种数(dfs+dp) 第八题 ...

最新文章

  1. baidumap api MySQL_百度地图API开发笔记一(基础篇)
  2. 小型化RDA5807调频收音模块实验板
  3. linux shell 语句出错自动退出 调试 检查 脚本
  4. 小郭经典mysql面试题资料_程序员经典面试题,Mysql是如何完成一次数据查询的...
  5. VTK:检查VTK的版本用法实战
  6. Angular karma test.ts里一些标准api用console.log打印出的输出
  7. Springboot 整合mybatis,实现多数据读写分离分库分表
  8. spring boot 定时间任务
  9. 21天Jenkins打卡Day17-查看Jenkins服务器上的目录结构
  10. 【数据结构入门】顺序表(SeqList)详解(初始化、增、删、查、改)
  11. Android MDM 参考资料
  12. 文献管理软件 EndNote20.1 for Windows版
  13. 将m个相同的球全部放到n个相同的盒子里面有几种放法
  14. 类工厂模式(TDB)
  15. python爬虫_网易音乐歌单
  16. 开源mysql执行平台_MySQL自动化审核平台部署说明
  17. 微信公众号、小程序账号被冻结的解决方法
  18. omap4430驱动
  19. phaser3适配微信小游戏
  20. B-Tree和LSM-Tree 优缺点对比

热门文章

  1. Codeforces Round #459 (Div. 1) B. MADMAX(dp+博弈)
  2. java qq聊天界面_用Java制作一个简单的QQ聊天界面
  3. 嵌入式软件工程师成长---所需要看的书籍
  4. 用Unity的GetSpectrumData方法识别钢琴曲中的钢琴琴键
  5. .Net 文件名后缀的详细解释
  6. Mac下驱动BCM20702A0 USB蓝牙
  7. excel怎么将文本转为数值
  8. item_search_img - 拍立淘搜索淘宝商品(淘宝API)
  9. 小米平板2,Windows10与Android互刷教程,小米平板2 线刷教程
  10. CNZZ埋点及点击量统计方法