NOIp2017真题模拟赛 By cellur925

果然我还是最菜的==不接受反驳

(先考了day2喵喵喵)

Day2

T1:奶酪

期望得分:100分

实际得分:100分

考察:并查集

思路:这题其实之前做过了==。思路还是比较清晰的,读入时预处理出可以“通天下地”的奶酪,之后n²枚举所有的奶酪关系,可以互达的就连到一个并查集中。互达怎么判断?即使是空间也没关系,将两个奶酪的球心距离与二倍半径比较即可。之前的题解

Code

 1 //15:31
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 
 6 using namespace std;
 7 typedef long long ll;
 8 
 9 int T,n;
10 int qwq[2000],qaq[2000],cnt,tot;
11 int f[2000];
12 ll h,r;
13 struct point{
14     ll x,y,z;
15 }p[2000];
16 
17 int getf(int x)
18 {
19     if(x==f[x]) return x;
20     else return getf(f[x]);
21 }
22 
23 double dis(int i,int j)
24 {
25     return (double)sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y)+(p[i].z-p[j].z)*(p[i].z-p[j].z));
26 }
27 
28 int main()
29 {
30     freopen("cheese.in","r",stdin);
31     freopen("cheese.out","w",stdout);
32     scanf("%d",&T);
33     while(T--)
34     {
35         scanf("%d",&n);
36         scanf("%lld%lld",&h,&r);
37         for(int i=1;i<=n;i++)
38         {
39             scanf("%lld%lld%lld",&p[i].x,&p[i].y,&p[i].z);
40             if(p[i].z-r<=0) qwq[++cnt]=i;
41             if(p[i].z+r>=h)    qaq[++tot]=i;
42         }
43         /*for(int i=1;i<=cnt;i++) printf("qwq:%d ",qwq[i]);
44         printf("\n");
45         for(int i=1;i<=tot;i++) printf("qaq:%d ",qaq[i]);
46         printf("\n");*/
47         for(int i=1;i<=n;i++) f[i]=i;
48         for(int i=1;i<=n;i++)
49             for(int j=1;j<=n;j++)
50             {
51                 if(dis(i,j)<=(double)2*r)
52                 {
53                     int pp=getf(i);
54                     int qq=getf(j);
55                     if(qq!=pp)
56                         f[qq]=pp;
57                 }
58             }
59         bool flag=0;
60         for(int i=1;i<=cnt;i++)
61         {
62             for(int j=1;j<=tot;j++)
63             {
64                 int a=qwq[i];int b=qaq[j];
65                 if(getf(a)==getf(b))
66                 {
67                     flag=1;
68                     printf("Yes\n");
69                     break;
70                 }
71             }
72             if(flag) break;
73         }
74         if(!flag) printf("No\n");
75         cnt=0;tot=0;
76     }
77     return 0;
78 }
cheese

*  注意long long,以及文件名qwq

T2:宝藏

期望得分:40分

实际得分:0分

考察:状压dp+dfs

考场心路历程:

//20 pts树的情况
//一定每条边都被选到

//40pts 所有的边权都相等
//那么根据乘法结合律,我们可以不再考虑边权对结果的影响
//那么答案可以转化为:枚举一个起点 使起点到 各点经过的点之和最小
//哎这样是不是可以重新建一个没有权的图进行一下遍历啊.....
//这样是不是转为一个树形dp了......
//假的。树形dp写爆了 用了spfa苟

其实思路是对的...Chemist dalao和lwz dalao都用的我的思路,40分稳稳拿到手。其实我那个20分并不需要写,因为树的情况时各边权也相等==。

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<queue>
  5 
  6 using namespace std;
  7 typedef long long ll;
  8 
  9 int n,m,tot,val;
 10 ll ans=1e10;
 11 int head[5000],d[5000],f[5000],dis[5000];
 12 bool vis[5000];
 13 struct node{
 14     int to,next,val;
 15 }edge[5000];
 16 
 17 void add(int x,int y,int z)
 18 {
 19     edge[++tot].to=y;
 20     edge[tot].next=head[x];
 21     head[x]=tot;
 22     edge[tot].val=z;
 23 }
 24 
 25 void dfs(int x,int fa)
 26 {
 27     vis[x]=1;
 28     for(int i=head[x];i;i=edge[i].next)
 29     {
 30         int y=edge[i].to;
 31         if(y==fa) continue;
 32         if(vis[y]) continue;
 33         d[y]=d[x]+1;
 34         f[y]=edge[i].val;
 35         dfs(y,x);
 36     }
 37 }
 38 //-------------------------------------------------------------
 39 void addqwq(int x,int y,int z)
 40 {
 41     edge[++tot].to=y;
 42     edge[tot].next=head[x];
 43     head[x]=tot;
 44     edge[tot].val=z;
 45 }
 46 
 47 /*void Treedp(int u,int fa)
 48 {
 49     vis[u]=1;
 50     for(int i=head[u];i;i=edge[i].next)
 51     {
 52         int v=edge[i].to;
 53         if(fa==v||v==root) continue;
 54     //    if(vis[v]) continue;
 55         dp[v]=min(dp[v],dp[u]+1);
 56         Treedp(v,u);
 57     }
 58 }*/
 59 
 60 void spfa(int s)
 61 {
 62     memset(dis,0x3f,sizeof(dis));
 63     queue<int>q;
 64     q.push(s);vis[s]=1;
 65     dis[s]=0;
 66     while(!q.empty())
 67     {
 68         int u=q.front();q.pop();
 69         vis[u]=0;
 70         for(int i=head[u];i;i=edge[i].next)
 71         {
 72             int v=edge[i].to;
 73             if(dis[v]>dis[u]+edge[i].val)
 74             {
 75                 dis[v]=dis[u]+edge[i].val;
 76                 if(!vis[v]) q.push(v),vis[v]=1;
 77             }
 78         }
 79     }
 80 }
 81 
 82 int main()
 83 {
 84     freopen("treasure.in","r",stdin);
 85     freopen("treasure.out","w",stdout); 
 86     scanf("%d%d",&n,&m);
 87     //20 pts树的情况
 88     //一定每条边都被选到 
 89     if(m==n-1)
 90     {
 91         for(int i=1;i<=m;i++)
 92         {
 93             int x=0,y=0,z=0;
 94             scanf("%d%d%d",&x,&y,&z);
 95             add(x,y,z);add(y,x,z);
 96         }
 97         for(int i=1;i<=n;i++)
 98         {
 99             ll tmp=0;
100             dfs(i,0);
101             for(int j=1;j<=n;j++)
102                 tmp+=(d[i]+1)*f[i];
103             ans=min(ans,tmp);
104             memset(d,0,sizeof(d));
105             memset(f,0,sizeof(f));
106         }
107         dfs(1,0);
108         for(int i=1;i<=n;i++)
109             ans+=(d[i]+1)*f[i];
110 /*        for(int i=1;i<=n;i++)
111             printf("%d ",d[i]);
112         printf("\n");
113         for(int i=1;i<=n;i++)
114             printf("%d ",f[i]);*/
115         printf("%lld",ans);
116         return 0;
117     }
118     // 40pts 所有的边权都相等
119     //那么根据乘法结合律,我们可以不再考虑边权对结果的影响 
120     //那么答案可以转化为:枚举一个起点 使起点到 各点经过的点之和最小
121     //哎这样是不是可以重新建一个没有权的图进行一下遍历啊.....
122     //这样是不是转为一个树形dp了...... 
123     //假的。树形dp写爆了 用了spfa苟 
124     for(int i=1;i<=m;i++)
125     {
126         int x=0,y=0;
127         scanf("%d%d%d",&x,&y,&val);
128         addqwq(x,y,1);addqwq(y,x,1);
129     }
130     for(int i=1;i<=n;i++)
131     {
132         ll qaq=0;
133         memset(vis,0,sizeof(vis));
134         spfa(i);
135         for(int j=1;j<=n;j++)
136             if(j==i) continue;
137             else qaq+=dis[j]+1;
138         ans=min(ans,qaq*val);
139     }
140     printf("%lld",ans);
141     return 0;
142 }
考场--treasure

所以到底哪里错了呢。查了整整一晚自习,才发现题意理解有些问题qwq。

而且在20分的部分程序中还要一个变量名ij写混了...

新开发一条道路的代价是:L*K

L代表这条道路的长度,K代表从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的 宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋) 。

当时理解的就是用spfa求出点个数最短路后再+1,临收卷不到5分钟,树p写挂了,开始写spfa,过了样例和自己的数据就草草交了,后来买饭还在想会不会爆int之类的...

结果一个晚自习后发现不需要加1,那样会重复算。因为经过的宝藏屋数量计数终止于修建一条道路的起点。所以不需要加1,边权与点权间转化是等效的。

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<queue>
  5 
  6 using namespace std;
  7 typedef long long ll;
  8 
  9 int n,m,tot,val;
 10 ll ans=1e10;
 11 int head[5000],d[5000],f[5000],dis[5000];
 12 bool vis[5000];
 13 struct node{
 14     int to,next,val;
 15 }edge[5000];
 16 
 17 void add(int x,int y,int z)
 18 {
 19     edge[++tot].to=y;
 20     edge[tot].next=head[x];
 21     head[x]=tot;
 22     edge[tot].val=z;
 23 }
 24 
 25 void dfs(int x,int fa)
 26 {
 27     vis[x]=1;
 28     for(int i=head[x];i;i=edge[i].next)
 29     {
 30         int y=edge[i].to;
 31         if(y==fa) continue;
 32         if(vis[y]) continue;
 33         d[y]=d[x]+1;
 34         f[y]=edge[i].val;
 35         dfs(y,x);
 36     }
 37 }
 38 //-------------------------------------------------------------
 39 void addqwq(int x,int y,int z)
 40 {
 41     edge[++tot].to=y;
 42     edge[tot].next=head[x];
 43     head[x]=tot;
 44     edge[tot].val=z;
 45 }
 46 
 47 /*void Treedp(int u,int fa)
 48 {
 49     vis[u]=1;
 50     for(int i=head[u];i;i=edge[i].next)
 51     {
 52         int v=edge[i].to;
 53         if(fa==v||v==root) continue;
 54     //    if(vis[v]) continue;
 55         dp[v]=min(dp[v],dp[u]+1);
 56         Treedp(v,u);
 57     }
 58 }*/
 59 
 60 void spfa(int s)
 61 {
 62     memset(dis,0x3f,sizeof(dis));
 63     queue<int>q;
 64     q.push(s);vis[s]=1;
 65     dis[s]=0;
 66     while(!q.empty())
 67     {
 68         int u=q.front();q.pop();
 69         vis[u]=0;
 70         for(int i=head[u];i;i=edge[i].next)
 71         {
 72             int v=edge[i].to;
 73             if(dis[v]>dis[u]+edge[i].val)
 74             {
 75                 dis[v]=dis[u]+edge[i].val;
 76                 if(!vis[v]) q.push(v),vis[v]=1;
 77             }
 78         }
 79     }
 80 }
 81 
 82 int main()
 83 {
 84 
 85     scanf("%d%d",&n,&m);
 86     // 40pts 所有的边权都相等
 87     //那么根据乘法结合律,我们可以不再考虑边权对结果的影响 
 88     //那么答案可以转化为:枚举一个起点 使起点到 各点经过的点之和最小
 89     //哎这样是不是可以重新建一个没有权的图进行一下遍历啊.....
 90     //这样是不是转为一个树形dp了...... 
 91     //假的。树形dp写爆了 用了spfa苟 
 92     for(int i=1;i<=m;i++)
 93     {
 94         int x=0,y=0;
 95         scanf("%d%d%d",&x,&y,&val);
 96         addqwq(x,y,1);addqwq(y,x,1);
 97     }
 98     for(int i=1;i<=n;i++)
 99     {
100         ll qaq=0;
101         memset(vis,0,sizeof(vis));
102         spfa(i);
103         for(int j=1;j<=n;j++)
104             if(j==i) continue;
105             else qaq+=dis[j];
106         ans=min(ans,qaq*val);
107     }
108     printf("%lld",ans);
109     return 0;
110 }
40pts--treasure

不过也是万幸能过发现自己审题的错误,Chemist把他的40分程序改动后也不对,模拟赛分低点总比NOIP爆炸强吧==。

正解:状压dp。

其实看数据范围也想到应该是状压了,就是首先dp不太会写,其次没想到怎么压,而且之前做的为数不多的状压题目都是在棋盘背景那种很显然的dp,状态设计比较显然。

所以还要做一些普适性的状压=w=。

在本题中的状态:0代表当前的宝藏屋没有被挖到(没与选定的起点联通),1代表挖到了。

设f[j]表示在状态j下,从起点到当前状态的最小花费,那么最后就是枚举所有起点取min{f[2^n-1]}。

转移过程:枚举已经挖过的所有点,再枚举这次要挖的点,记录dis[j]表示从jj到起点经过的点的数量。每次转移的时候特判一下是否属于当前状况,

转移:dp[s|(1<<(j-1))]=min(dp[s]+dis[i]*v[i][j],dp[s|(1<<(j-1))]);

时间复杂度:O(n^3*2^n)

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 int n,m,ans=2147483630,fake;
 8 int v[20][20],dp[5000],dis[1000];
 9 
10 void dfs(int s)
11 {
12     for(int i=1;i<=n;i++)
13     {
14         if(!(s&(1<<(i-1)))) continue;//现在找的是已经挖过的点 
15         for(int j=1;j<=n;j++)
16         {
17             if(s&(1<<(j-1))) continue;//现在找的是没挖过的点 
18             if(v[i][j]==fake) continue;//要找可有边直接连通的 
19             if(dp[s]+dis[i]*v[i][j]<dp[s|(1<<(j-1))])
20             {//更新 
21                 int odd=dis[j];//记录原来值,以便日后回溯 
22                 dp[s|(1<<(j-1))]=dp[s]+dis[i]*v[i][j];//更新 因为修i到j这条边 所以点的个数到dis[i]即可 
23                 dis[j]=dis[i]+1;//更新 
24                 dfs(s|(1<<(j-1)));//向下搜 
25                 dis[j]=odd;//返回原来值 
26             }
27         }
28     }
29 }
30 
31 int main() 
32 {
33     scanf("%d%d",&n,&m);
34     memset(v,0x3f,sizeof(v));
35     for(int i=1;i<=m;i++)
36     {
37         int x=0,y=0,z=0;
38         scanf("%d%d%d",&x,&y,&z);
39         v[x][y]=v[y][x]=min(v[y][x],z);
40     }//邻接矩阵存图 
41     for(int i=1;i<=n;i++)
42     {
43         memset(dp,0x3f,sizeof(dp));
44         fake=dp[2];//每次的更新 
45         memset(dis,0x3f,sizeof(dis));
46         dis[i]=1;
47         dp[(1<<(i-1))]=0;//赋初值 
48         dfs(1<<(i-1));
49         ans=min(ans,dp[(1<<n)-1]);//更新答案        
50     }
51     printf("%d\n",ans);
52     return 0;
53 }
AC--treasure

状压中的技巧

求最后完备状态(假设都是1),有n个待枚举状态,结果是(1<<n)-1

要只取i这一位是1,其他都是0,那么(1<<(i-1))

T3:列队

期望得分:30分

实际得分:30分

考场心路历程:题意还是比较亲民的,管他呢30分暴力先打上再说。后来详见这张图...

 正解:动态开点线段树(名字都没听说过.......)

 从上面那张图中,我们可以看出,我考场的心路历程十分混乱==想到链表是因为基础知识不牢,忘记了链表的适用范围与优点,结果在这块浪费了不少时间。感觉考2015时还有这次,都反而在T3,难度较大的题目上用的时间比T2多,结果给得分率可能更高的T2思考少了空间。这是需要改正的==。

Day2小结:暴露出的问题是基础知识不牢,一直想自己捋一捋了,不过搞不动就很难受==听说听课以后有时间让我们自己整理一下,就很好;还有问题是时间用的不太紧,这几次都是这样,前松后紧了,导致交卷前5分钟还在码代码感觉就会很不好,容易出锅,以及刚才说的T2与T3时间分配的问题;还有问题是暴力的分拿不准,审题出现不准的问题。

Day1

T1:小凯的诱惑

期望得分:100分

实际得分:100分

考察:数论数学&结论

小学奥数题目,可能是去年在noip考场上最认真做的一道题(当时其他题看都看不懂),敲了无数if语句,NOIP2017抱了5分回家==。

注意开longlong!

 1 #include<cstdio>
 2 #include<algorithm>
 3 
 4 using namespace std;
 5 typedef long long ll;
 6 
 7 ll a,b,c;
 8 
 9 int main()
10 {
11     freopen("math.in","r",stdin);
12     freopen("math.out","w",stdout);
13     scanf("%lld%lld",&a,&b);
14     c=a*b-(a+b);
15     printf("%lld",c);
16     return 0;
17 }
math

T2:时间复杂度

期望得分:100分

实际得分:60分

考察:字符串处理&模拟

思路:之前没做过啊...今天的考试又名只做第二题(逃)。第三题看上去十分不可做的样子,草草打了30分开始专心致志写第二题。写的时候思路还是比较清楚的,还是有一些细节没写好以及最后时间紧张心态几乎爆炸,所以丢了40分==。

      首先是读入。注意到每个循环语句都由四个部分组成,我便用了一个结构体来储存各条语句。里面包含几个字符数组。

   之后是判错,觉得判错应该是先处理好的,如果有错就不应再检查复杂度了。注意到题面里写着只可能有两种错误 :F与E不匹配--这个可以用一个栈来维护。新建的变量与已经存在但未被销毁的变量重复两种情况--可以用bool数组来维护这个变量是否曾经存在但未被销毁。打这一部分用了大概几乎一小时,时间有点浪费了。先后出现了多组数据清空结构体有些麻烦的问题和数组开小了的问题(大样例真香)。不过打完觉得判错这部分应该是稳了。这时已经是17:13。

    再之后是查错了。查错分为两部分:先把小明认为的复杂度处理出来(因为是用字符串读进来的,而且可能不是一位数),以及计算正确的复杂度。而我计算的基本思想是,如果循环嵌套,就在答案上加1,如果是常数类的,就加零。也就是把乘法巧妙的转化为加法。当时我对自己的想法还是有些怀疑的,但是时间真的不够了,今天还要早收卷==写完大致后就开始调调调调大样例,没有再瞪眼检查样例可能涉及不到的细节了。然后处理小明认为的复杂度时还是出锅了...虽然有之前做另一道恶心的模拟题相对分子质量的转化数字经验==。具体的锅是:字符数组的下标和循环的下标搞混了,还有用ksm进位的时候乘方乘多了...这个时候大家已经都跑饭去惹==,还好坚持下来苟了60分,要不60分都得不了==。

    所以到底是哪里错了呢?开始下载洛谷数据检查。首先发现:用来记录循环是否不能再记录(无法进入的循环)的flag在每一次后没有更新。交一发后多了10分。继续检查,发现一种循环的特殊情况:就是多个循环嵌套以后结束了几个循环,之后又开始了一系列循环。这样我们更新答案的时候就可能会少记录或者多记录一些东西。最后改变策略,将更新答案的条件放宽,一边更新一边减去结束的循环,这样就A了。

  1 // 17:13 err解决 感动! 
  2 // 17:56 算出正确复杂度 
  3 #include<cstdio>
  4 #include<algorithm>
  5 #include<stack>
  6 #include<cstring>
  7 #include<cctype>
  8 
  9 using namespace std;
 10 
 11 int T,lin;
 12 bool vis[500];
 13 char sta[100];
 14 
 15 // tmp
 16 struct node{
 17     char l[200],r[200];
 18     char fir[200],cha[200];
 19 }word[500]; 
 20 
 21 int ksm(int a,int b)
 22 {
 23     int ans=1;
 24     while(b)
 25     {
 26         if(b&1) ans=ans*a;
 27         b>>=1;
 28         a=a*a;
 29     }
 30     return ans;
 31 }
 32 
 33 void read()
 34 {
 35     for(int i=1;i<=lin;i++)
 36     {
 37         scanf("%s",word[i].fir+1);
 38         if(word[i].fir[1]=='F')
 39         {
 40             scanf("%s",word[i].cha+1);
 41             scanf("%s%s",word[i].l+1,word[i].r+1);    
 42         }
 43     }
 44 }
 45 
 46 bool checkerr()
 47 {
 48     stack<int>sf;
 49     for(int i=1;i<=lin;i++)
 50     {
 51         if(word[i].fir[1]=='F')
 52         {
 53             sf.push(i);
 54             if(vis[(int)word[i].cha[1]]==1) return 1;
 55             vis[(int)word[i].cha[1]]=1;
 56         }
 57         else if(word[i].fir[1]=='E')
 58         {
 59             if(sf.empty()) return 1;
 60             int u=sf.top();
 61             sf.pop();
 62             vis[(int)word[u].cha[1]]=0;
 63         } 
 64     }
 65     if(!sf.empty()) return 1;
 66     return 0;
 67 }
 68 
 69 bool illegal(int pos)
 70 {
 71     int len1=strlen(word[pos].l+1);
 72     int len2=strlen(word[pos].r+1);
 73     int rl=0,rr=0;
 74     for(int i=1;i<=len1;i++)
 75         rl+=ksm(10,len1-i)*((int)word[pos].l[i]);
 76     for(int i=1;i<=len2;i++)
 77         rr+=ksm(10,len2-i)*((int)word[pos].r[i]);
 78     if(rl>rr) return 1;
 79     return 0; 
 80 }
 81 
 82 int getsta()
 83 {
 84     int pos=5,ans=0;
 85     while(isdigit(sta[pos])) pos++;
 86     pos--;
 87     int len=pos-5+1;
 88     int nowpos=5;
 89     for(int i=1;i<=len;i++)
 90     {
 91         ans+=ksm(10,len-i)*((int)sta[nowpos]-'0');
 92         nowpos++;
 93     }
 94     return ans;
 95 }
 96 
 97 int checktim()
 98 {
 99     stack<int>se;
100     int ans=0,tmp1=0,tmp2=0;
101     bool flag=0;
102     for(int i=1;i<=lin;i++)
103     {
104         if(word[i].fir[1]=='F')
105         {
106             se.push(i);
107             if(word[i].l[1]=='n'&&word[i].r[1]!='n') flag=1;
108             if(word[i].l[1]!='n'&&word[i].r[1]!='n'&&illegal(i))
109                 flag=1;
110             if(!flag)
111             {
112                 if(word[i].r[1]=='n'&&word[i].l[1]!='n') tmp1++;
113                 else tmp2++;
114             }
115         }
116         else if(word[i].fir[1]=='E')
117         {
118             se.pop();
119             ans=max(ans,tmp1);
120             tmp1--;
121             if(se.empty())
122             {
123                 if(tmp1) ans=max(ans,tmp1);
124                 else ans=max(ans,0);
125                 tmp1=0,tmp2=0;flag=0;
126             } 
127         }
128     } 
129 //    return ans;
130     if(sta[3]=='1'&&ans==0) return 1;
131     if(sta[3]=='1'&&ans!=0) return 0;
132     int qwq=getsta();
133 //    printf("%d ",qwq);
134 //    printf("%d ",ans);
135     if(qwq==ans) return 1;
136     else return 0;
137 }
138 
139 void init()
140 {
141     for(int i=1;i<=lin;i++)
142     {
143         if(word[i].fir[1]=='E') memset(word[i].fir+1,0,sizeof(word[i].fir+1));
144         else
145         {
146             memset(word[i].fir+1,0,sizeof(word[i].fir+1));
147             memset(word[i].cha+1,0,sizeof(word[i].cha+1));
148             memset(word[i].l+1,0,sizeof(word[i].l+1));
149             memset(word[i].r+1,0,sizeof(word[i].r+1));
150         }
151     }
152     memset(vis,0,sizeof(vis));
153 }
154 
155 int main()
156 {
157     scanf("%d",&T);
158     while(T--)
159     {
160         scanf("%d",&lin);
161         scanf("%s",sta+1);
162         read();
163         if(checkerr())
164         {
165             printf("ERR\n");
166             init();
167             continue;
168         }
169     //    printf("%d\n",checktim());
170         if(checktim()) printf("Yes\n");
171            else printf("No\n");
172         init();
173     }
174     return 0;
175 }
complexity

小结:这道题虽然做的还是不尽如人意==,但是也有进步(了吧?)。毕竟最后时间压的很紧的情况下还是比较稳的改错,然后开始写判断err的代码的时候也比较稳。不足的地方是时间把握的还是比较松散,或者说是码力不足打不动,以及细节没考虑完备,面向大样例编程而不是完备整个思维qwq。

留下几个大模拟的坑题(高爸推荐:杀蚂蚁、PASTE)。

T3:逛公园

期望得分:30分

实际得分:0分

考场心路历程:观察到k=0有三个点,可以直接使用最短路计数算法,一顿敲敲敲。等等,无解的 情况怎么判断?等填坑。还要去做第二题啊qwq。

结果发现自己原来掌握的最短路计数算法其实是有问题的,趁这个机会学(改正)了一下,真的是裸的最短路计数算法。改后(学后)就是30分了。

正解是记忆化搜索+dp,自己本来搜索和dp就很弱,两个一起来,更不知所措了qwq。

Day1小结:今天的时间利用应该是比昨天高效了许多,不过,现实中,T1你会在一分钟内保证AC地切掉,然后再心态稳地去打T2T3?时间用的不好还是码力不高,思维欠提升,思考问题的能力有待改善。T2也告诉我们要先肉眼查错,不断给自己设计反例,确保全面正确。

  

两天期望得分:100+100+30+100+40+30=400

实际得分:100+60+0+100+0+30=290,挂了两道题......

期望和实际差的太多,就是说自己写出的程序不能保证正确,也就是说平时做题的正确率低。

自己的一些知识点还是太弱了,只掌握在皮毛的水平,比如:线段树,状压dp等。水平在300分上下徘徊,暴力的分反而没正解的分稳。

希望把基础知识砸牢后,思维水平也会有一个新的提升吧。

猜你喜欢

转载自www.cnblogs.com/nopartyfoucaodong/p/9679372.html