NOIP模拟测试15「建造城市city(插板法)·轰炸·石头剪刀布」

建造城市

题解

先思考一个简单问题

10个$toot$ 放进5间房屋,每个房屋至少有1个$toot$,方案数

思考:插板法,$10$个$toot$有$9$个缝隙,$5$间房屋转化为$4$个挡板,放在toot缝隙之间得到$C_{9}^{4}$

10个$toot$ 放进$5$间房屋,每个房屋里可以没有$toot$,方案数

思考:插板法使用条件必须是每组至少有1个,那么我们事先在每个房屋中放一个$toot$变成$15$个$toot$放进$5$个房屋,可以插板法,与上一题类似$C_{14}^{4}$

那么应用到这个题上呢?

这个题$toot$加了一个上界,非常棒对不对,我们可以考虑容斥

怎么算$\sum\limits_{i=0}^{i<=n}  {-1}^i *C_{n}^{i}*C_{m-i*k-1}^{n-1}$

前面是枚举的多的城市,后面枚举的是多的,怎么理解呢?

首先我们让$i$个城市提前选出$i*k$ 个 $toot$,假设我们当前是$i==0$,那么我们选出的包含0个不符合情况的,1个不符合情况的,2个不符合情况的,3个不符合情况的------n个

我们只需要简单容斥一下就完了

代码

     #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 10101010
#define mod 998244353
ll ni[A],jie[A];
ll n,m,k;
ll meng(ll x,ll k){ll ans=1;for(;k;k>>=1,x=x*x%mod)if(k&1)ans=ans*x%mod;return ans;
}
ll C(ll n,ll m){return jie[n]*ni[n-m]%mod*ni[m]%mod;
}
int main(){jie[0]=1;for(ll i=1;i<=10000000;i++)jie[i]=jie[i-1]*i%mod;ni[10000000]=meng(jie[10000000],mod-2);for(ll i=9999999;i>=1;i--)ni[i]=ni[i+1]*(i+1)%mod;ni[0]=1;
/*    while(1){ll a,b;scanf("%lld%lld",&a,&b);cout<<C(a,b)<<endl;}
*/    scanf("%lld%lld%lld",&n,&m,&k);ll ans=0,tmp=1;for(ll i=0;i<=n;i++){if(n-1>m-i*k-1) break;ans=(ans+tmp*C(n,i)*C(m-i*k-1,n-1)%mod)%mod;tmp=-tmp;}cout<<(ans+mod)%mod<<endl;
}

轰炸

语文不好被坑了

一句话题解

tarjan缩点+最长链

代码不放了

石头剪刀布

很奇妙的思路,但觉的现在还是似懂非懂的。

首先这个题是先计算所有概率,最后再统计贡献

和以往做的期望题不太一样

这个题没有顺序很恶心,思考换一种方法避免无序带来影响

我们发现如果只开三维,最后根本无法统计答案,统计起来会像一坨

尝试开四维?

$f[i][j][k][4]$

$f[i][j][k][1]$表示已经有$i$个人出石头,$j$个人出剪刀,$k$个人出布,下一轮出石头

$f[i][j][k][2]$表示已经有$i$个人出石头,$j$个人出剪刀,$k$个人出布,下一轮出剪刀

$f[i][j][k][3]$表示已经有$i$个人出石头,$j$个人出剪刀,$k$个人出布,下一轮出布

这样答案转移起来就很好转移了

$ans=\sum\limits _{i=1}^{i<=n} max(f[i][j][k][1]+f[i][j][k][2]*3,f[i][j][k][2]+f[i][j][k][3]*3,f[i][j][k][3]+f[i][j][k][1]*3)$

思考状态转移

直接转移肯定难以转移,开辅助数组$g[i][j][k]$表示出$i$个石头,$j$个剪刀,$k$个布的概率

显然我们可以得到

$f[i][j][k][u]=f[i-1][j][k][u]*x[o][1]+f[i][j-1][k][u]*x[o][2]+f[i][j][k-1][u]*x[o][3]+(x[o][1]+x[o][2]+x[o][3])*g[i][j][k]$

思考这是什么意思

拿1举例,你当前状态已经这样,你又往里面放了一个人,他出了石头,那么当前概率就等于之前的概率*转移过来的概率

下面是迪哥解释

        //当u>0时就不太一样了,计算的是接下来出1的概率
        //它由上一轮对方出1的概率乘对方真的出了1的概率累加而来,此时i+j+k!=s
        //因为你把这玩意当成一个背包不断往里面放对手来更新其概率
        //意思大概就是“目前的状态已经是那样了而且下一轮你遇到了s”,然后s对你的概率产生的贡献
        //所以就是你走到原状态的概率,乘上s出1的概率,就是s对目前状态的概率贡献
        //所以i+j+k==s时不能枚举到3,因为相当于你的原状态里面已经有s个人了,可是你现在刚刚开始考虑第s个人啊

细节

你最后统计答案时不能枚举到n因为n没有下一个人了

吴迪带注释代码

#include<bits/stdc++.h>
using namespace std;
//首先题意可能还有人理解错了。题目的意思是你要根据对手分别出了几个石头几个剪刀来决策
//而并不是一场战斗结束后你就能知道对方具体是谁从而直接推断剩下的人
#define d(x,k) for(int x=k;x>=0;--x)//压行,字少
int n;double x[51][4],f[51][51][51][4],ans,c[51][51];
//f数组的含义:当最后一维为1~3时表示第i+j+k+1个人在前面的人出了i个1,j个2,k个3的情况下出1~3的概率
//当最后一维为0时表示前i+j+k个人出了i个1,j个2,k个3的概率,即那个题解里的g数组
int main(){ scanf("%d",&n); f[0][0][0][0]=1;//初始化for(int i=1;i<=n;++i) scanf("%lf%lf%lf",&x[i][1],&x[i][3],&x[i][2]),x[i][1]/=300,x[i][2]/=300,x[i][3]/=300;//读入概率,注意顺序是132。把石头剪刀步分别抽象为123,故1胜2,2胜3,3胜1for(int i=0;i<=50;++i) c[i][0]=1;for(int i=1;i<=50;++i) for(int j=1;j<=i;++j) c[i][j]+=c[i-1][j-1]+c[i-1][j];//杨辉三角。注意:要用到50!级别的而没有取模,所以要开long long或doublefor(int s=1;s<=n;++s) d(i,s) d(j,s-i) d(k,s-i-j) d(u,(i+j+k==s?0:3)){//有点像个背包//你可以把s单独再开一维的数组来表示目前考虑到第几个人,更好理解但貌似会炸内存//u为1~3时,分别枚举第几个人,前面的人出过几个1,2,3,这个人要出u//注意u的枚举是当i+j+k!=s时才更新对方下一次出123的概率,否则只更新到达某状态的概率//u为0时,计算到达这个状态的总概率(即题解中的g数组)if(i)f[i][j][k][u]+=f[i-1][j][k][u]*x[s][1];//这个人s出了1,累加概率//当u=0时,f[i][j][k][0]由f[i-1][j][k][0]转移而来(u=0并不考虑下一个人会出什么)//在原状态出一个1即为新状态,后者的概率为x[s][1]。计算g数组就不必考虑其他f值的影响//因为根据含义就有f[i][j][k][0]=f[i][j][k][1]+f[i][j][k][2]+f[i][j][k][3]//当u>0时就不太一样了,计算的是接下来出1的概率//它由上一轮对方出1的概率乘对方真的出了1的概率累加而来,此时i+j+k!=s//因为你把这玩意当成一个背包不断往里面放对手来更新其概率//意思大概就是“目前的状态已经是那样了而且下一轮你遇到了s”,然后s对你的概率产生的贡献//所以就是你走到原状态的概率,乘上s出1的概率,就是s对目前状态的概率贡献//所以i+j+k==s时不能枚举到3,因为相当于你的原状态里面已经有s个人了,可是你现在刚刚开始考虑第s个人啊if(j)f[i][j][k][u]+=f[i][j-1][k][u]*x[s][2];//出2,同上if(k)f[i][j][k][u]+=f[i][j][k-1][u]*x[s][3];//出3,同if(u)f[i][j][k][u]+=f[i][j][k][0]*x[s][u];//这个就是弥补了上面的缺陷。本层转移。不管目前的状态是什么,反正第s个人就是出u了//与上面的并不重复。一个是在说s对以前的状态的贡献,这个是在说s对当前状态的贡献
    }d(i,n-1) d(j,n-1-i) d(k,n-i-j-1)//i+j+k不要枚举到n,因为已经进行过n轮后下一次再出什么已经不重要不记分了ans+=max(max(f[i][j][k][1]+3*f[i][j][k][2],f[i][j][k][2]+3*f[i][j][k][3]),f[i][j][k][3]+3*f[i][j][k][1])/c[n][i+j+k]/(n-i-j-k);//在每一种状态下(即确定对手已经出了i个1,j个2,k个3)时你都有唯一确定的最优决策来进行下一轮//每一次决策时都会累加分数,3种决策分别对应出1,2,3.f[i][j][k][1]即为与1打平,3*f[i][j][k][2]即为战胜2//你所说的最优决策就是根据已有信息(每个对手出了什么),通过猜测对手下一步会出什么来权衡3中决策//至于为什么用到了组合数:因为你所算的概率只是到达这一步的概率,但是你是从n个人里随便选出了c[n][i+j+k]个人//然而其实在同一场游戏中对于同样的i+j+k你只会选1次,在计算的时候你把概率累加在一起了,现在要求一个平均值//再除一个(n-i-j-k)的原因也差不多,因为你是要从剩下的(n-i-j-k)个人里选出一个去挑战//这一步的概率是1/(n-i-j-k),然而你在上面5层循环的时候并没有考虑,所以在这里统一除去printf("%.12lf\n",ans);//给的std里是用%.12f输出double的,真是惊奇
}//把注释全删掉你就会发现这个代码只有21行811B
View Code

我这个菜鸡的代码

#include<bits/stdc++.h>
using namespace std;
#define A 52
#define ll long long
double f[A][A][A][5],x[A][5];
double ans=0;
ll C[A][A],n;
int main(){f[0][0][0][0]=1;scanf("%lld",&n);for(ll i=0;i<=n;i++)C[i][0]=1;for(ll i=1;i<=n;i++)for(ll j=1;j<=i;j++)C[i][j]=C[i-1][j]+C[i-1][j-1];for(ll i=1;i<=n;i++)scanf("%lf%lf%lf",&x[i][1],&x[i][3],&x[i][2]),x[i][1]/=300,x[i][3]/=300,x[i][2]/=300;for(ll o=1;o<=n;o++){for(ll i=o;i>=0;i--){for(ll j=o-i;j>=0;j--){for(ll k=o-i-j;k>=0;k--){for(ll u=(((i+j+k)==o)?0:3);u>=0;u--){if(i)f[i][j][k][u]+=f[i-1][j][k][u]*x[o][1];if(j)f[i][j][k][u]+=f[i][j-1][k][u]*x[o][2];if(k)f[i][j][k][u]+=f[i][j][k-1][u]*x[o][3];if(u)f[i][j][k][u]+=f[i][j][k][0]*x[o][u];}}}}}for(ll i=n-1;i>=0;i--)for(ll j=n-1-i;j>=0;j--)for(ll k=n-1-i-j;k>=0;k--){ans+=max(max(f[i][j][k][1]+f[i][j][k][2]*3,f[i][j][k][2]+f[i][j][k][3]*3),f[i][j][k][3]+f[i][j][k][1]*3)/C[n][i+j+k]/(n-i-k-j);}printf("%.12lf\n",ans);
}
View Code

 

转载于:https://www.cnblogs.com/znsbc-13/p/11327441.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

弹簧和线程:TaskExecutor

在Web应用程序中使用线程并不常见&#xff0c;尤其是当您必须开发长期运行的任务时。 考虑到spring&#xff0c;我们必须格外注意并使用它已经提供的工具&#xff0c;而不是生成我们自己的线程。 我们希望线程由spring管理&#xff0c;因此能够在不产生任何影响的情况下使用应…

数位dp从会打模板到不会打模板

打了几个数位$dp$&#xff0c;发现自己除了会打模板之外没有任何长进&#xff0c;遇到非模板题依然什么都不会 那么接下来这篇文章将介绍如何打模板&#xff08;滑稽&#xff09; 假设我们要处理$l----r$ 采用记忆化搜索的方式&#xff0c;枚举$<r$每一种情况&#xff0c;枚…

javafx简单吗_JavaFX即将推出您附近的Android或iOS设备吗?

javafx简单吗已经有大新闻最近在世界上的JavaFX的关于JavaFX的是许多更多的组件开源&#xff0c;开源的广告在2012 JavaOne大会 。 在2月的开放源代码更新中 &#xff0c; Richard Bair编写了一份JavaFX项目表&#xff0c;该表在撰写本文时&#xff08;2013年2月11日&#xff0…

【webrtc】webrtc的rtp重传代码分析

pgm不太能用&#xff0c;没有想象中的可靠&#xff0c;重传机制貌似仍然使用组播重传&#xff0c;丢包率80%的网络感觉没啥改进&#xff0c;如果有所好转延迟估计也是个不小的问题。 后听说rtp也有nack机制&#xff0c;webrtc基于rtp实现了重传在一定程度上保证可靠性。 在各路…

了解java.nio.file.Path – 1

介绍 Java的最后几个发行版本&#xff0c;即Java 7&#xff0c;Java 8和即将到来的Java 9&#xff0c;具有许多功能&#xff0c;这些功能使Java开发人员的生活更加轻松。 &#xff08;我知道Java 9会使它变得更困难&#xff0c;但是只有在您采用新的范例时才可以。之后&#xf…

socket-01

对于所有的Web应用&#xff0c;本质上其实就是一个socket服务端&#xff0c;用户的浏览器其实就是一个socket客户端 转载于:https://www.cnblogs.com/yanhuaqiang/p/11329925.html

ActionScript3学习笔记2-包

在 ActionScript 3.0 中&#xff0c;包是用命名空间实现的&#xff0c;但包和命名空间并不同义。在声明包时&#xff0c; 可以隐式创建一个特殊类型的命名空间并保证它在编译时是已知的。显式创建的命名空间在 编译时不必是已知的。 下面的示例使用 package 指令来创建一个包含…

grep v grep_使用grep4j轻松测试分布式组件上的SLA

grep v grep因此&#xff0c;您的分布式体系结构如下图所示&#xff0c;您刚刚从企业那里收到了一项要求&#xff0c;以确保生产者发送并随后传输到下游系统&#xff08;消费者&#xff09;的消息的SLA必须快且永远不会慢于此。 400毫秒。 要求说&#xff1a; 从生产者发送到…

得到指定进程所有窗口。显示 影藏 置顶。

这里使用一个外挂程序测试&#xff0c;因为外挂程序没有做功能限制的处理 只是做了 窗口影藏。 全局变量 HWND hwnd[100]{0};int number0;DWORD Tpid0; 局部变量 char username[1028]; 先找到进程ID 1 HWND SelectPor() 2 { 3 bool isYesfalse; 4 string porcessName&q…

jquery部分方法

offset([coordinates]) 概述&#xff1a;获取匹配元素在当前视口的相对偏移。返回的对象包含两个整型属性&#xff1a;top 和 left。此方法只对可见元素有效。 比如&#xff0c;获取第二段的偏移&#xff1a; HTML 代码: <p>Hello</p><p>2nd Paragraph</p…

JUnit 5扩展模型的生命周期

JUnit5最终版本即将来临 &#xff08;当前是M4&#xff09;&#xff0c;我已经开始研究如何编写扩展。 在JUnit5中 &#xff0c;您没有使用Runners &#xff0c; Rules &#xff0c; ClassRules等&#xff0c;而是只有一个Extension API来实现自己的扩展。 JUnit5提供了多个接…

让IE6、IE7、IE8支持CSS3

我们都知道IE6&#xff0c;7并不支持CSS3的属性&#xff0c;IE8也不能很好的支持CSS3。但是有一个小脚本能够做到&#xff0c;它可以让IE支持 CSS3&#xff0c;包括&#xff1a;border-radius (rounded), box-shadow ( shadow), text-shadow等…… 如果你需要一个支持CSS3 的bo…

NOIP模拟测试16「Drink·blue·weed」

话说这次考试 Drink 非常棒的一道卡常练习题&#xff0c;适合练习卡常 真的很棒 前置卡常知识 1.char要比int快 char是最快的 输出putchar&#xff0c;输入getchar 在这个题快了7000豪 2.read 快读非常棒&#xff0c;让你变得更快&#xff0c;fread更棒&#xff0c;fread会爆炸…

Spring Boot Web Slice测试–示例

春天开机推出 测试切片而回&#xff0c;它已经采取了一些时间来解决它我的头&#xff0c;并探讨一些细微的差别。 背景 使用此功能的主要原因是减少样板。 考虑一个看起来像这样的控制器&#xff0c;仅适用于使用Kotlin编写的各种控制器。 RestController RequestMapping(&qu…

DECODE函数

DECODE函数相当于一条件语句(IF),它将输入数值与函数中的参数列表相比较&#xff0c;根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然&#xff0c;如果未能与任何一个实参序偶匹配成功&#xff0c;则函数也有默认的返回值。区别于…

多线程练习

写两个线程&#xff0c;其中一个线程打印1-52&#xff0c;另一个线程打印A-Z&#xff0c;打印顺序应该是12A34B56C......5152Z。 该习题需要用到多线程通信的知识。 思路分析&#xff1a; 把打印数字的线程称为线程N&#xff0c;打印字母的线程称为线程L. 1.线程N完成打印后&am…

java jee curd_Java / JEE中的有效日志记录–映射的诊断上下文

java jee curd这一切始于当我和一位同事坐在一起解决一些应用程序问题时&#xff0c;当我注意到一些有趣的事情时。 他正在合并代码&#xff0c;我的眼睛吸引了此类“ org.apache.log4j.MDC”的注意。 这导致了以下发现&#xff1a; 什么是MDC&#xff1f; MDC代表“ 映射诊断…

Learning Cocos2d-x for WP8(7)——让Sprite动起来

C#(wp7)兄弟篇Learning Cocos2d-x for XNA&#xff08;7&#xff09;——让Sprite动起来 本讲将详细介绍Cocos2d-x游戏中动画Animate的创建方式&#xff0c;通过逐帧数组播放动画和创建动画集合播放动画&#xff0c;比较两者的异同&#xff0c;让Sprite动起来。 工程文件&#…

GWT的渐进式Web应用程序配方

渐进或不渐进… 如果您一段时间以来一直在设计或开发Web应用程序&#xff0c;那么您可能会遇到无数次“渐进式Web应用程序”一词&#xff0c;并且在未来几年内可能会这样做。 您可能想知道PWA的确切定义是什么&#xff0c;如何识别PWA&#xff0c;以及如何构建PWA。 根据字典&a…

问题 1047: [编程入门]报数问题

题目描述有n人围成一圈&#xff0c;顺序排号。从第1个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人退出圈子&#xff0c;问最后留下的是原来的第几号的那位。输入初始人数n输出最后一人的初始编号样例输入3 样例输出2分析&#xff1a;因为每次报3都会…