zoukankan      html  css  js  c++  java
  • [考试反思]1016csp-s模拟测试76:自知

    要打对拍。

    要打对拍。

    要打对拍。

    要手模数据。

    要手模数据。

    要手模数据。

    不要相信样例。

    不要相信样例。

    不要相信样例。

    不要飘。

    不要飘。

    不要飘。

    跟skyh学坏了。最近不打对拍。

    连续十几次考试都没打对拍,都没有出锅。

    但是这次就崩了。

    飘了。最近是有点飘。

    也算是敲响了警钟吧。

    样例都是精心构造的,有的是故意让你理解错的,有的是故意让你打错的。

    我的代码除了样例基本都输出No,随便手模了一组样例就挂了。

    侥幸拿到了30分。虽然也没爆零,但是也足以长记性了吧。

    其实是一个大小于号打反了,判断条件写错了。

    要对码下的每一个字负责。

    上一轮11场以rank5告终了:2330/2143/2002/1924/1895/1890/1863/1853/1796/1731/1646/1630/1619/1590/1575|机房分数线

    (和谐了一句话),跟前面的三个大神和一个大脸差距极大。。。

    但是上一轮总体来说,尤其到后半,还是比较稳的。

    可是这一轮一开始就是严重爆炸,直接150分差敬上。。。

    长记性吧,别再犯了。

    T1:序列

    简单的构造题。根据A*B=N的特殊数据就可以造了。

    注意大小于号不要写反。

     1 #include<cstdio>
     2 int main(){
     3     int t,n,a,b;scanf("%d",&t);
     4     while(t--){
     5         scanf("%d%d%d",&n,&a,&b);
     6         if(a+b-1>n||1ll*a*b<n){puts("No");continue;};
     7         puts("Yes");n-=a;b--;
     8         for(int i=1;i<=a;++i)printf("%d ",n+i);
     9         if(!b){puts("");continue;}
    10         int sz=n/b+1,tms=n%b,sz2=n/b,tms2=b-n%b;
    11         while(tms--){n-=sz;for(int i=1;i<=sz;++i)printf("%d ",n+i);}
    12         while(tms2--){n-=sz2;for(int i=1;i<=sz2;++i)printf("%d ",n+i);}
    13         puts("");
    14     }
    15 }
    444B

    T2:购物

    算是半个结论,但是稍显然。排序后考虑每个物品的一半和前面所有物品的sum的关系,看有没有断档即可。

     1 #include<cstdio>
     2 #include<algorithm>
     3 int n;long long a[100005],sum,l[100005],r[100005],ans;
     4 int main(){
     5     scanf("%d",&n);
     6     for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
     7     std::sort(a+1,a+1+n);
     8     for(int i=1;i<=n;++i)
     9         if((a[i]+1>>1)>r[i-1])ans+=r[i-1]-l[i-1]+1,sum+=a[i],l[i]=a[i]+1>>1,r[i]=sum;
    10         else l[i]=l[i-1],sum+=a[i],r[i]=sum;
    11     ans+=r[n]-l[n]+1;
    12     printf("%lld
    ",ans-1);
    13 }
    386B

    T3:计数

    看起来很难。

    前序遍历有很多性质。

    (——By rvalue %%%,他讲的太好了我就不想写了)

    数对的限制很难处理。怎么突破?

    可以发现在前序遍历确定后,中序遍历关系所限制的,其实就是a是否在b的左子树内。

    进一步说,b限制的是a的子树大小。

    如果在子树内,那么限制的就是左子树大小的下界,否则限制上界。

    所以设dp[i][j]表示以i为根的子树大小为j。然后就

    记忆化一发即可。

    (当然也可以直接dp参见LNC)

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 #define mod 1000000007
     5 int liml[405],limr[405],dp[405][405],m,n;
     6 int sch(int ord,int sz){
     7     if(dp[ord][sz]!=-1)return dp[ord][sz];
     8     if(!sz)return dp[ord][sz]=1;
     9     dp[ord][sz]=0;
    10     for(int k=liml[ord];k<sz&&k<=limr[ord];++k)dp[ord][sz]=(dp[ord][sz]+1ll*sch(ord+1,k)*sch(ord+1+k,sz-k-1))%mod;
    11     return dp[ord][sz];
    12 }
    13 int main(){
    14     int t,n,m,a,b;scanf("%d",&t);
    15     while(t--){
    16         scanf("%d%d",&n,&m);
    17         for(int i=1;i<=n+1;++i)for(int j=0;j<=n;++j)dp[i][j]=-1;
    18         for(int i=1;i<=n;++i)liml[i]=0,limr[i]=n-i+1;
    19         while(m--){
    20             scanf("%d%d",&a,&b);
    21             if(a>b)liml[b]=max(liml[b],a-b);else limr[a]=min(limr[a],b-a-1);
    22         }printf("%d
    ",sch(1,n));
    23     }
    24 }
    View Code
  • 相关阅读:
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    8.4 确定两个日期之间的月份数或年数
    (Java实现) 洛谷 P1553 数字反转(升级版)
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11689828.html
Copyright © 2011-2022 走看看