[考试反思]1026csp-s模拟测试88:发展

不用你们说,我自己来:我颓闪存我没脸。

昨天的想法,

今天的回答。

生存,

发展。

总分榜应该稍有回升,但是和上面的差距肯定还是很大。

继续。

为昨天的谬误,承担代价。

T2和T3都值得张记性。

T2因为上次输出了"-0.00"在文本比较下与"0.0"不同导致WA,所以这次输出的时候把答案加了0.005

但是加的太多了,在四舍五入下恰好进位了导致WA。

为了防止输出"-0.0"要将答案加一个1e-9级别的数,不要太小也不要太大。

T3算错上限没打高精。

考虑极端情况。考试时不要用__int128(CSP-S不认可)

我不喜欢RP守恒。

我想稳在rank5以内。遥不可及。

T1:军训队列。

一个明显的斜率优化dp。但是考场上推了一会没有推出来。

然而这题用不到,因为身高最多有6001种,所以$O(6001*6001*k)$可过

但是要注意把所有人身高压起来后n可能小于k,判掉。

斜率优化的假单调栈可以当成是一个剪枝。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 double dp[100005][21],h[100005];int n,k,q[100005],qh,qt;
 5 double fab2(double x){return x*x;}
 6 double cal(int j,int k,int f){return (dp[j][f-1]-dp[k][f-1])/(h[j+1]-h[k+1])+h[j+1]+h[k+1];}
 7 int main(){
 8     scanf("%d%d",&n,&k);
 9     for(int i=1;i<=n;++i)scanf("%lf",&h[i]);
10     sort(h+1,h+1+n);n=unique(h+1,h+1+n)-h-1;h[n+1]=1e9;
11     for(int i=1;i<=n;++i)dp[i][1]=fab2(h[i]-h[1]);
12     for(int j=2;j<=k;++j){
13         q[qt=qh=1]=0;
14         for(int i=1;i<=n;++i){
15             dp[i][j]=1e18;
16             while(qt-qh>=1&&cal(q[qh+1],q[qh],j)<h[i]*2)qh++;
17             for(int p=qh;p<=qt;++p)dp[i][j]=min(dp[i][j],dp[q[p]][j-1]+fab2(h[i]-h[q[p]+1]));
18             q[++qt]=i;
19         }
20     }printf("%.2lf\n",dp[n][k]);
21 }

T2:山屋惊魂

规模不是很大的模拟。虽说也不小。

预处理一下dize[i][j]表示用i个骰子得到j的概率。(骰子的英语不是dize。。。打脸。。。但是我懒得改了)

然后。。我也不知道该讲什么。。。模拟好像真的没办法讲。。。

按照题目说的就是了。不要读错题

其实我不是很明白为什么会打的那么长,并没有感觉这个模拟比以前的模拟难很多。。。

 1 #include<cstdio>
 2 #include<string>
 3 #include<iostream>
 4 #include<map>
 5 using namespace std;
 6 map<string,int>M;
 7 long double dize[9][17],pos[101][4098],fail,ans[4][8],lim[102][4][8];
 8 int n,st[4],s[102],c1[102],c2[102],num;
 9 string bar[4],knd,opt;
10 int chg(int S,int p,int w){return (S^S&7<<p*3)|w<<p*3;}
11 int main(){//freopen("betrayal.in","r",stdin);
12     dize[0][0]=1;
13     for(int i=0;i<=7;++i)for(int j=0;j<=i<<1;++j)
14         dize[i+1][j]+=dize[i][j]/3,dize[i+1][j+1]+=dize[i][j]/3,dize[i+1][j+2]+=dize[i][j]/3;
15     for(int i=0;i<4;++i)cin>>bar[i]>>st[i],st[i]--;
16     cin>>n;
17     pos[0][st[0]|st[1]<<3|st[2]<<6|st[3]<<9]=1;
18     M["Might"]=0;M["Speed"]=1;M["Sanity"]=2;M["Knowledge"]=3;
19     for(int i=0;i<n;++i){
20         cin>>knd>>opt;
21         if(opt=="<"){
22             cin>>num;
23             for(int j=0;j<=7;++j)for(int k=0;k<=16;++k)lim[i][M[knd]][j]+=(dize[bar[M[knd]][j]-‘0‘][k]*(k>=num));
24             cin>>knd>>opt;
25         }else if(opt=="<="){
26             cin>>num;
27             for(int j=0;j<=7;++j)for(int k=0;k<=16;++k)lim[i][M[knd]][j]+=(dize[bar[M[knd]][j]-‘0‘][k]*(k> num));
28             cin>>knd>>opt;
29         }else if(opt==">"){
30             cin>>num;
31             for(int j=0;j<=7;++j)for(int k=0;k<=16;++k)lim[i][M[knd]][j]+=(dize[bar[M[knd]][j]-‘0‘][k]*(k<=num));
32             cin>>knd>>opt;
33         }else if(opt==">="){
34             cin>>num;
35             for(int j=0;j<=7;++j)for(int k=0;k<=16;++k)lim[i][M[knd]][j]+=(dize[bar[M[knd]][j]-‘0‘][k]*(k< num));
36             cin>>knd>>opt;
37         }
38         s[i]=M[knd];
39         if(opt[0]==‘+‘)if(opt.length()==3)c2[i]+=opt[1]-‘0‘;
40             else c1[i]+=opt[1]-‘0‘;
41         if(opt[0]==‘-‘)if(opt.length()==3)c2[i]-=opt[1]-‘0‘;
42             else c1[i]-=opt[1]-‘0‘;//printf("%d %d %d\n",s[i],c1[i],c2[i]);
43     }
44     for(int i=0;i<n;++i)for(int S=0;S<1<<12;++S){
45         int state[4]={S&7,S>>3&7,S>>6&7,S>>9&7};
46         double rp=pos[i][S];
47         for(int j=0;j<4;++j)rp*=(1-lim[i][j][state[j]]);
48         pos[i+1][S]+=pos[i][S]-rp;
49         if(c1[i]){
50             state[s[i]]+=c1[i];state[s[i]]=min(state[s[i]],7);
51             if(state[s[i]]<0)fail+=rp;
52             else pos[i+1][chg(S,s[i],state[s[i]])]+=rp;
53         }else if(c2[i]>=0){
54             for(int r=0;r<=16;++r){
55                 double P=rp*dize[c2[i]][r];
56                 int nw=state[s[i]]+r;nw=min(nw,7);
57                 pos[i+1][chg(S,s[i],nw)]+=P;
58             }
59         }else{
60             for(int r=0;r<=16;++r){
61                 double P=rp*dize[-c2[i]][r];
62                 int nw=state[s[i]]-r;
63                 if(nw<0)fail+=P;
64                 else pos[i+1][chg(S,s[i],nw)]+=P;
65             }
66         }ed:;
67     }
68     printf("%.2Lf\n",fail*100+0.0001);
69     for(int i=0;i<1<<12;++i)for(int k=0;k<4;++k)ans[k][bar[k][i>>k*3&7]-‘1‘]+=pos[n][i];
70     for(int k=0;k<4;++k,puts(""))for(int i=0;i<8;++i)printf("%.2Lf ",ans[k][i]*100+0.0001);
71 }

2.4k,可写

T3:彩球问题

记忆化搜索/dp

状态4维,12/12/12/4,分别表示还有1/2/3个的球有几种颜色,且上一次用的球还剩下0/1/2个

然后又是模拟?

最后的答案貌似有$10^33$级别?

 1 #include<cstdio>
 2 #define dp re[c1][c2][c3][lst]
 3 __int128 ans,re[13][13][13][3];int cnt[4],n,x;
 4 __int128 sch(int c1,int c2,int c3,int lst){
 5     if(dp!=-1)return dp;
 6     dp=0;
 7     if(c1==0&&c2==0&&c3==0)return 1;
 8     if(lst==0){
 9         if(c1)dp+=c1*sch(c1-1,c2,c3,0);
10         if(c2)dp+=c2*sch(c1+1,c2-1,c3,1);
11         if(c3)dp+=c3*sch(c1,c2+1,c3-1,2);
12     }else if(lst==1){
13         if(c1>1)dp+=(c1-1)*sch(c1-1,c2,c3,0);
14         if(c2)dp+=c2*sch(c1+1,c2-1,c3,1);
15         if(c3)dp+=c3*sch(c1,c2+1,c3-1,2);
16     }else if(lst==2){
17         if(c1)dp+=c1*sch(c1-1,c2,c3,0);
18         if(c2>1)dp+=(c2-1)*sch(c1+1,c2-1,c3,1);
19         if(c3)dp+=c3*sch(c1,c2+1,c3-1,2);
20     }return dp;
21 }
22 int main(){
23     scanf("%d",&n);
24     while(n--)scanf("%d",&x),cnt[x]++;
25     for(int i=0;i<13;++i)for(int j=0;j<13;++j)for(int k=0;k<13;++k)for(int l=0;l<3;++l)re[i][j][k][l]=-1;
26     __int128 x=sch(cnt[1],cnt[2],cnt[3],0);
27     if(x/1000000000000000000ll)printf("%lld",(long long)(x/1000000000000000000ll));
28     printf("%lld\n",(long long)(x%1000000000000000000ll));
29 }

你可以用int128水过

 1 #include<cstdio>
 2 #define dp re[c1][c2][c3][lst]
 3 struct LL{
 4     long long x[5];
 5     #define mod 100000000
 6     friend void operator+=(LL &a,LL b){
 7         for(int i=0;i<5;++i)a.x[i]+=b.x[i];
 8         for(int i=0;i<4;++i)a.x[i+1]+=a.x[i]/mod,a.x[i]%=mod;
 9     }
10     void print(int i=4){
11         for(;~i;--i)if(x[i]){printf("%lld",x[i]);break;}
12         for(--i;~i;--i)printf("%08lld",x[i]);
13     }
14     friend LL operator*(int x,LL a){
15         for(int i=0;i<5;++i)a.x[i]*=x;
16         for(int i=0;i<4;++i)a.x[i+1]+=a.x[i]/mod,a.x[i]%=mod;
17         return a;
18     }
19     friend bool operator!=(LL a,int x){return a.x[0]!=-1;}
20     void operator=(int p){x[0]=p;}
21 };
22 LL ans,re[13][13][13][3];int cnt[4],n,x;
23 LL sch(int c1,int c2,int c3,int lst){
24     if(dp!=-1)return dp;
25     dp=0;
26     if(c1==0&&c2==0&&c3==0)return dp=1,dp;
27     if(lst==0){
28         if(c1)dp+=c1*sch(c1-1,c2,c3,0);
29         if(c2)dp+=c2*sch(c1+1,c2-1,c3,1);
30         if(c3)dp+=c3*sch(c1,c2+1,c3-1,2);
31     }else if(lst==1){
32         if(c1>1)dp+=(c1-1)*sch(c1-1,c2,c3,0);
33         if(c2)dp+=c2*sch(c1+1,c2-1,c3,1);
34         if(c3)dp+=c3*sch(c1,c2+1,c3-1,2);
35     }else if(lst==2){
36         if(c1)dp+=c1*sch(c1-1,c2,c3,0);
37         if(c2>1)dp+=(c2-1)*sch(c1+1,c2-1,c3,1);
38         if(c3)dp+=c3*sch(c1,c2+1,c3-1,2);
39     }return dp;
40 }
41 int main(){
42     scanf("%d",&n);
43     while(n--)scanf("%d",&x),cnt[x]++;
44     for(int i=0;i<13;++i)for(int j=0;j<13;++j)for(int k=0;k<13;++k)for(int l=0;l<3;++l)re[i][j][k][l]=-1;
45     sch(cnt[1],cnt[2],cnt[3],0).print();
46 }

但是显然作为一个有脸的人还是要写一次高精的

因为真正CSP-S上也不能用__int128,所以就算是模拟赛写高精也是很有必要的。

态度必须要有,天人不相欺。

原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11742950.html

时间: 2024-10-08 15:10:47

[考试反思]1026csp-s模拟测试88:发展的相关文章

2019.10.26 csp-s模拟测试88 反思总结

今天的主人公是什么? 60.1K!!!! 先扔代码再更新防止我等会儿一上头不打算写完题解 T1: #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const double inf=214748364; int n,k; double a[100010],f[21][100010]; int main() { scanf("%d%d",&n

[考试反思]0929csp-s模拟测试55:沦陷

菜得过分. 面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了... T1这种大模板啊...其实我是觉得我能打出来的,然后先用一个小时码了一个2k. 然后做T2想贪心就出来了.十分钟码完T3暴力之后回T1打对拍瞬间爆炸. 于是又重新打了一个2k,WA0.对拍发现. 然后考试就没几分钟了交暴力走了. 不要打完就跑,记得早点对拍改进思路. T1: 的确是挺裸的线段树.离散化或者权值线段树都可以. 但是考场上两个都打出来都死了. 最后用离散化A的. 1 #include<cstdio> 2

[考试反思]1002csp-s模拟测试56:凌乱

放假回来状态回升??(玩够了-但是稍困) T1打的不完全对,但是过掉了.很快的想到了二分吧喇叭啦.. 然后T2也挺快想出来了但是挂细节没发现,考试快结束的时候才发现出锅了. 改了过来是正解,但是出题人无良卡了线段树强制树状数组,T了一个子任务,卡常到飞起. T3暴力没什么问题. 卡常是一种习惯.要注意题目数据范围观察是否卡常. T1: 所有的决策都是一条一次函数. 分两类,斜率正或斜率非负. 如果第二类的直线里有在T=0时符合要求的,那么答案就是0,所以check(0)一下. 如果非负的直线都在

[考试反思]1003csp-s模拟测试58:沉淀

稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使用的话,切记计算内存,一点都不能开大. T1: 直接根号筛,拿map也能过. 遍历map直接begin和end啊... 1 #include<cstdio> 2 int Cnt[202]; 3 struct hash_map{ 4 int cnt,fir[10000020],l[6666666],

[考试反思]0114省选模拟7:迷离

这次考得相对不错,但是没什么水准. 只不过记得T1这道原题而已.虽说我忘了怎么做,而且数据范围不一样...差不多是从头想的. 但是并没有AC,像个弱智一样,有两个细节写的完全不对还有80分运气也是真好. 其实挂了不止两个细节...以为是原题于是上来就写20分钟写完,然后过一会出一个锅... 然后看T2,感觉$O(nk^2)$也许差不多?常数很大...但也不会别的.挺好想但是不是很好写. 于是乎强烈谴责cbx没素质暴力水题考后还不改正解的无脸行径 于是就开始写,写了一个半小时. 看T3,绝对大神题

模拟测试68,69

68: 32 AlpaCa 41 03:08:20 31 02:46:16 30 02:46:28 102 03:08:20 69: 28 AlpaCa 20 02:51:15 60 03:05:32 0 01:39:45 80 03:05:32 彻底挂掉了呢. 不过也还好吧,至少之后的考试不会有那么大压力了吧(出第一机房是肯定的事了),那利用之后几场考试就调整好状态,下次再来嘛. 但是最近炸了那么多场还是要反思一下,其实不只是心态的问题,自身实力,考试技巧,时间分配等方面好像都有点问题. 69

微信在线信息模拟测试工具(基于Senparc.Weixin.MP)

目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具在线DEMO:http://weixin.senparc.com/SimulateTool Senparc.Weixin.MP是一个开源的微信SDK项目,地址:https://github.com/JeffreySu/WeiXinMPSDK (其中https://github.com/Jeffrey

2016年上半年软考真题在线模拟测试,提前知晓你的成绩

2016年上半年软考于5月21日结束了,考试完想知道结果的急切心理,几乎每个经历过上学时代的人都能深刻体验到.如果你想知道你考的怎么样,如果你想要提前知道你的成绩,如果你想知道你哪个地方出错了,如果你想知道你哪个地方知识掌握的不够想要更深入的去理解,那就来希赛软考学院吧!希赛软考学院提供2016年上半年软考真题在线模拟测试,有标准的参考答案,有专业老师的解析视频,让你提前知晓你的成绩,让你再次巩固学习. 希赛授课专家介绍 张友生,计算机应用技术博士,软考培训教程系列丛书主编,考试指定教材<系统分

noip模拟测试11

T1:string 第一眼秒出思路,这不就是排序那道题的加强版吗? 然而歪?解复杂度虽然是对的,但常数过大,竟被卡到70 歪?解:(实际上std写的就是这个,但据说std被卡掉了 OAO) 因为字符集很小,所以我们可以把区间排序改为区间查询和覆盖 即:先查询区间内所有字符的个数,再从左端点开始按照大小关系依次将长度为字符个数的区间修改为该字符. 期望复杂度O ( 26*mlogn ),实际复杂度O ( 26*mlogn*(巨大的常数) ) 所以需要一(feng)定(kuang)的卡常 正?解: