摘要: 题目是这样的,每个人手中有a和b的钱数,c为a和b中间最小的一个。每个回合,两个人胜利的概率都是0.5,胜利者从失败者手中获得c的钱数。如果有一个人手中没钱的话,那么他就failer,游戏结束。现在给你初始状态问你这次游戏需要进行的回合以及A胜利的期望值分别为多少?这样的,自己手动模拟几组数据就会发现胜利的概率就是a/(a+b)。对于回合数,我们可以深搜,但是有的可能有环,所以我们只要设置深搜上线只需要深度为20即可。因为超过20的肯定不会对小数前五位产生影响。#include #include #include using namespace std;int a,b,n,m,k=0;doub 阅读全文
posted @ 2013-11-19 22:00 092000 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 题目是很简单的队列维护的题目。每次加入之前判断该字母是否在队列以及队列的容量是否超过k即可。#include #include #include #define maxn 1666using namespace std;int q[maxn],inq[maxn];char s[maxn];int n,k,t,head,tail,ans,cas=0;int main(){ scanf("%d",&t); while (t--) { scanf("%d%d",&n,&k); scanf("%s",s); head= 阅读全文
posted @ 2013-11-19 21:53 092000 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 有趣的博弈题。关键在于把比边权的平分到两边的点权上面,然后点权排序,每次从大的开始拿就可以了。#include #include #include #include #define maxn 100100using namespace std;double a[maxn];int n,m,u,v;double w,s1,s0;int main(){ while (scanf("%d%d",&n,&m)!=EOF) { for (int i=1; i0; i--) { if (m&1) s0+=a[i]; ... 阅读全文
posted @ 2013-11-19 21:45 092000 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 题目是这样的,一个等边三角形,三边都是有镜子组成的。现在要你从一个点射入一条光线,问你如果要求光线在三角形里面反射n次然后从入点射出来的话,入射的方向可能有多少种?这。。。。。其实不难。关键是要搞清楚镜子反射的规律。这样来理解。反射的话相当于在另一面也是一个三角形,这样我们可以把同样的等腰三角形铺满整个二维空间。这样就会发现规律,如果我们把所有的点都分层,那么发现射到第一层的反射次数为1,第二层为3,第三才层为5,这样下来我们就可以知道如果要反射n次射出的那个对称点应该在那个层数了。到此我们唯一的问题就是求出每一层有多少个点了。但是有多少个点就是答案吗? 不是的,如果后面的点被前面的点遮挡了, 阅读全文
posted @ 2013-11-19 21:24 092000 阅读(492) 评论(0) 推荐(0) 编辑
摘要: 这个题目做得泪牛满面。题目为给你若干串,有的表示添加一个串,有的表示询问一个串有多少个字串为前面出现过的串。题目一看就知道肯定是AC自动机(不过后缀自动机也是可以的)但是细想就会发现AC自动机好像不支持在线修改。如果你每次读入一个串就重构一次AC自动机的话,那么时间复杂度达到了N^2,肯定会T的。于是就产生了一种奇葩的解法。搞两个自动机,一个自动机为大的自动机,一个自动机为小的自动机(用于缓冲)。每次我都只把字符串加入到小的自动机里面并且重构小自动机,当小自动机的容量超过了sqrt(L)的时候,我们把小自动机合并到大自动机上,这样算下来时间复杂度为O(L*sqrt(L)),每次询问的答案就是大 阅读全文
posted @ 2013-11-19 10:07 092000 阅读(776) 评论(0) 推荐(0) 编辑