zoukankan      html  css  js  c++  java
  • [考试反思]1013csp-s模拟测试72:距离

    最近总是这个样子。

    看上去排名好像还可以,但是实际上离上面的分差往往能到80分,但是身后的分差其实只有10/20分。

    比上不足,比下也不怎么的。

    所以虽然看起来没有出rank10,但是在总分排行榜上却是不断下滑的。

    说白了,就是暴力打满了,没什么出彩之处,自然会被超越。

    最近又有一点摸鱼的迹象了,尤其是昨天这一场。

    最近考场上打出T2T3正解的概率越来越低了,在打暴力方面却是怪强的。。。

    而且看上去这一次貌似并不是实力问题,可能态度也不太端正?

    需要及时调整。

    昨天晚上的确有摸鱼的成分了。

    T1是个比较套路的dp,没什么问题慢悠悠的拿下。

    然后剩下的时间就基本一直在摸鱼了

    T2产生了一个正解思路,但是感觉转移及其难写,就一直在犹豫看有没有什么简单的方法

    然后到最后也就是一个暴力,加上一个根本拿不到分的随机化

    T3是的确不会,需要自行发现一个结论

    本来就不太会图论,又在T2上晃荡,就没有想出来

    心态有一点浮了

    重视考试的每一分钟,专注思考,不要摸鱼。

    紧绷神经,沿着思路想下去。

    不要给自己设限,不要凭空想象它有多难,想完就码就是了。

    最近的状态还是不行,一定要再有提升啊

    T1:简单的序列

    如题。简单。

    dp[i][j][0/1]表示已经用了n-m位里的i位,有j个多余的左括号,是否已经用了S串。

    转移不是很麻烦(相较于T2)

     1 #include<cstdio>
     2 #define mod 1000000007
     3 inline void add(int &x,int p){x+=p;if(x>=mod)x-=mod;}
     4 inline int min(int a,int b){return a<b?a:b;}
     5 inline int max(int a,int b){return a>b?a:b;}
     6 int n,m,dp[2][2005][2005],mn,tt;char s[100005];
     7 int main(){
     8     scanf("%d%d%s",&n,&m,s+1);
     9     for(int i=1;i<=m;++i){
    10         tt+=s[i]=='('?1:-1;
    11         mn=min(mn,tt);
    12     }
    13     if(mn<m-n){puts("0");return 0;}
    14     if(tt>n-m){puts("0");return 0;}
    15     dp[0][0][0]=1;if(mn>=0)dp[1][0][tt]=1;
    16     for(int i=1;i<=n-m;++i){
    17         for(int j=0;j<=2000;++j){
    18             add(dp[0][i][j],dp[0][i-1][j+1]);
    19             add(dp[0][i][j],dp[0][i-1][j?j-1:2001]);
    20             add(dp[1][i][j],dp[1][i-1][j+1]);
    21             add(dp[1][i][j],dp[1][i-1][j?j-1:2001]);
    22         }
    23         for(int j=-mn;j+tt<=2000;++j) add(dp[1][i][j+tt],dp[0][i][j]);
    24     }
    25     printf("%d
    ",dp[1][n-m][0]);
    26 }
    View Code

    T2:简单的期望

    刚开始我还以为不能考两个dp吧,但是它真的就考了。

    然后虽说转移比较麻烦(7种),但是其实很好想。

    dp[i][j][k][0/1]表示操作了i次,最后8位是j,右移8位后最后有连续k位是0/1。

    考场上发现了:因为你最多进行200次加法,所以高于8位的进位最多进行1次。

    对于加1,只需要特殊处理j=255(0/1各1个式子),其它都直接加(1个式子)

    对于乘2,只需要分别考虑j<128和j>=128,再分别讨论0/1(一共2*2个式子)

    思路很清晰。也很好打。

     1 #include<cstdio>
     2 double dp[201][256][233][2],i0[256],ans;
     3 int main(){
     4     int x,n,r,s,cnt=0;double p,q;
     5     scanf("%d%d%lf",&x,&n,&p);p/=100;q=1-p;
     6     r=x&255;x>>=8;s=x&1;//puts("done");
     7     if(x==0)s=0,cnt=1;
     8     else while((x&1)==s)cnt++,x>>=1;
     9     dp[0][r][cnt][s]=1;
    10     for(int i=1;i<=n;++i){
    11         for(int j=0;j<255;++j)for(int k=1;k<=230;++k)for(int l=0;l<=1;++l)
    12             dp[i][j+1][k][l]+=dp[i-1][j][k][l]*q;//+
    13         for(int k=1;k<=230;++k)dp[i][0][k][0]+=dp[i-1][255][k][1]*q;//+
    14         for(int k=1;k<=230;++k)dp[i][0][1][1]+=dp[i-1][255][k][0]*q;//+
    15         for(int j=0;j<128;++j)for(int k=1;k<=230;++k)
    16             dp[i][j<<1][1][0]+=dp[i-1][j][k][1]*p,
    17             dp[i][j<<1][k+1][0]+=dp[i-1][j][k][0]*p;//*
    18         for(int j=128;j<256;++j)for(int k=1;k<=230;++k)
    19             dp[i][j<<1&255][1][1]+=dp[i-1][j][k][0]*p,
    20             dp[i][j<<1&255][k+1][1]+=dp[i-1][j][k][1]*p;
    21     }
    22     for(int i=1;i<256;++i){int j=i;while((j&1)==0)j>>=1,i0[i]++;}
    23     for(int j=1;j<=255;++j)for(int k=1;k<=230;++k)for(int l=0;l<=1;++l)ans+=dp[n][j][k][l]*i0[j];
    24     for(int k=1;k<=230;++k)ans+=dp[n][0][k][0]*(k+8)+dp[n][0][k][1]*8;
    25     printf("%.8lf
    ",ans);
    26 }
    View Code

    T3:简单的操作

    算是半个结论题,不容易严谨证明

    存在奇环就无解,这个好说,因为最后一定会剩下一个3元环。

    还是从简单的情况推到复杂的。

    树->联通图->图

    对于一棵树,可以通过选出直径,把其它的链往直径上并,得到长度为直径的链。

    直径是什么?联通块里任意两点之间的最短路的最大值。

    在树上加边形成环,得到联通图,上述结论依然成立。

    如果不联通,那就把你得到的多条链合并起来,答案就是长度之和。

     1 #include<cstdio>
     2 #include<vector>
     3 using namespace std;
     4 inline int max(int a,int b){return a>b?a:b;}
     5 vector<int>v[1005];
     6 int n,m,fir[1005],l[200005],to[200005],cnt,co[1005],tim,fal,dt[1005],lg[1005];
     7 int q[1005],ans;
     8 void link(int a,int b){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;}
     9 void dfs(int p,int col){
    10     v[col>>1].push_back(p);co[p]=col;
    11     for(int i=fir[p];i;i=l[i])if(!co[to[i]])dfs(to[i],col^1);
    12         else if(co[to[i]]==col)fal=1;
    13 }
    14 int main(){
    15     scanf("%d%d",&n,&m);
    16     for(int i=1,x,y;i<=m;++i)scanf("%d%d",&x,&y),link(x,y),link(y,x);
    17     for(int i=1;i<=n;++i)if(!co[i])tim+=2,dfs(i,tim);
    18     if(fal){puts("-1");return 0;}
    19     tim>>=1;//puts("done");
    20     for(int i=1;i<=tim;++i)
    21         for(int j=0;j<v[i].size();++j){
    22             for(int k=0;k<v[i].size();++k)dt[v[i][k]]=1666;
    23             dt[v[i][j]]=0;q[1]=v[i][j];
    24             for(int qh=1,qt=1;qh<=qt;++qh)
    25                 for(int e=fir[q[qh]];e;e=l[e])if(dt[to[e]]>dt[q[qh]]+1)
    26                     dt[to[e]]=dt[q[qh]]+1,q[++qt]=to[e];
    27             for(int k=0;k<v[i].size();++k)lg[i]=max(lg[i],dt[v[i][k]]);
    28         }
    29     for(int i=1;i<=tim;++i)ans+=lg[i];
    30     printf("%d
    ",ans);
    31 }
    View Code
  • 相关阅读:
    安装win7 ubuntu双系统
    idea maven打jar包
    mongodb入门
    mongodb备份与恢复
    使用cmd时cd命令失效
    vue 项目中使用阿里巴巴矢量图标库iconfont
    vue img标签用法
    vue 点击当前元素改变样式
    vue 路由跳转传参
    iview table绑定双击事件
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11669439.html
Copyright © 2011-2022 走看看