期中考总结&NOIP2017总结html
2017年11月11日,我第二次参加NOIP普及组复赛。上一年,个人得分是250分,只拿到了二等奖。我便把目标定为拿到一等奖,考到300分以上。函数
早上8点多,咱们去302教室,听同窗讲考试注意事项(有十几条),有两条令我受益不浅——要吃饱;不要定义与自带函数重名的变量或函数(如x0,y0什么的)。优化
咱们看了本身的考试信息后,就上车了。11点多就到达广州了。spa
吃中午餐的地方是一间名叫都城快餐的快餐店,咱们却吃了一个多小时的快餐(有人等饭等了四十多分钟)code
吃完饭后,咱们走去广州六中,接着在那里休息(睡午觉)。2点钟就去考场了。htm
比赛2点半开始,6点钟结束。开始考试后,我用了40分钟看了一下题目。blog
T1:
哇!好水呀!
直接输出\({\frac{2a}{10}+\frac{3b}{10}}+\frac{5c}{10}\)不就完事了吗?
这题不会那么水的!我又看了看题,确保万无一失,以防把这唾手可得的100分弄丢了。
而后就AC了。get
T2:
嗯,挺水的。
一眼出正解——暴力!
个人方法就是暴力,只不过加了一点优化(由于比赛时我担忧此题有坑)
考场AC!
PS:此题用字典树是最快的。io
T3:
一开始想到了DFS,又想到了DP,到了动手作题前,才发现DP过不了,就打了个记忆化搜索。ast
相信许多人都以为魔法特难搞,其实并不难。
经过找规律,咱们不难发现,从有颜色的格子开始走,能够走到任意格子,无论它有没有颜色。
而没有颜色的格子却只能走到那些有颜色的格子上(不能连续两次用魔法)
那怎么计算使用魔法的花费呢?我发现,能够分红两种状况判断:
而后记录一下上一个格子坐标就行了。
考场AC!
T4:
这题我0分,题解见http://www.javashuo.com/article/p-aspguvkr-mk.html。
比赛结束后,我忐忑不安地离开考场。不知道今年我能考到多少分呢?应该是310~320吧(然而只拿了300分)!
晚饭咱们不是在都城快餐吃了,咱们去到了一间饭店吃。不知为什么,老师点了特别多的菜,每一桌的菜数比人数还要多!
最后咱们固然是没吃完的。有诗云:
锄禾日当午,汗滴禾下土。
谁知盘中餐,粒粒皆辛苦。
个人良心受到了谴责!
T1:
#include<cstdio> using namespace std; int main() { freopen("score.in","r",stdin); freopen("score.out","w",stdout); int a,b,c; scanf("%d%d%d",&a,&b,&c); printf("%d\n",a/10*2+b/10*3+c/10*5); return 0; }
T2:
#include<cstdio> using namespace std; int a[1010],s[11]; void qsort(int l,int r) { int i=l,j=r,mid=a[(l+r)/2],t; while(i<=j) { while(a[i]<mid) i++; while(a[j]>mid) j--; if(i<=j) { t=a[i]; a[i]=a[j]; a[j]=t; i++;j--; } } if(i<r) qsort(i,r); if(l<j) qsort(l,j); } int main() { freopen("librarian.in","r",stdin); freopen("librarian.out","w",stdout); int n,q,i,j=0,need,len,k=1; bool haveFind_theBook; scanf("%d%d",&n,&q); for(i=1;i<=n;i++) scanf("%d",&a[i]); qsort(1,n); for(i=0;i<11;i++) s[i]=1; for(i=1;i<=n;i++) { while(a[i]>=k) { j++;s[j]=i; k=k*10; } } while(q--) { scanf("%d%d",&len,&need); if(len==0) { printf("-1\n"); continue; } k=1;haveFind_theBook=false; for(i=1;i<=len;i++) k=k*10; for(i=s[len];i<=n;i++) { if(a[i]%k==need) { haveFind_theBook=true; printf("%d\n",a[i]); break; } } if(!haveFind_theBook) printf("-1\n"); } return 0; }
T3:
#include<cstdio> using namespace std; #define maxlongint 0x7fffffff const int dx[4]={1,0,-1,0}; const int dy[4]={0,1,0,-1}; int n,c[101][101],f[101][101]; void dfs(int x,int y,int cost,int X,int Y) { if(f[x][y]<=cost) return; f[x][y]=cost; int i,xx,yy; for(i=0;i<4;i++) { xx=x+dx[i];yy=y+dy[i]; if(xx>0&&yy>0&&xx<=n&&yy<=n) { if(c[x][y]==0) { if(c[xx][yy]==0) continue; else { if(c[X][Y]==c[xx][yy]) { dfs(xx,yy,cost,1,1); } else dfs(xx,yy,cost+1,1,1); } } else { if(c[xx][yy]==0) { dfs(xx,yy,cost+2,x,y); } else { if(c[x][y]==c[xx][yy]) { dfs(xx,yy,cost,1,1); } else dfs(xx,yy,cost+1,1,1); } } } } } int main() { freopen("chess.in","r",stdin); freopen("chess.out","w",stdout); int m,i,j,x,y,z; scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); c[x][y]=z+1; } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { f[i][j]=maxlongint; } } dfs(1,1,0,1,1); if(f[n][n]==maxlongint) printf("-1\n"); else printf("%d\n",f[n][n]); return 0; }
T4:
#include<cstdio> using namespace std; #define maxlongint 1999999999//事实证实,用-maxlongint的效果最好 int f[500001],queue[500001],x[500001],s[500001]; int main() { freopen("jump.in","r",stdin); freopen("jump.out","w",stdout); int n,d,k,l=0,r=1000000000,mid,i,j,t,ans=-1,maxx,minn,head,tail,last; bool bk,bz; scanf("%d%d%d",&n,&d,&k); for(i=1;i<=n;i++) scanf("%d%d",&x[i],&s[i]); l=0;r=1000000000; while(l<=r) { mid=(l+r)/2; maxx=d+mid;bk=false;bz=true; minn=d-mid;last=0; if(minn<1) minn=1; tail=head=1; queue[1]=0; for(i=1;i<=n;i++) { if(maxx>=x[i]&&minn<=x[i]) { bz=false; break; } } if(bz) { l=mid+1; continue; } for(i=1;i<=n;i++) { f[i]=maxlongint; for(j=last+1;j<i;j++) { if(x[j]+minn>x[i]) break; if(x[j]+maxx<x[i]) continue; last=j; if(f[j]==maxlongint) continue; while(head<=tail&&f[queue[tail]]<=f[j]) queue[tail--]=0; queue[++tail]=j; } while(head<tail&&x[queue[head]]+maxx<x[i]) head++; if(x[queue[head]]+maxx<x[i]||x[queue[head]]+minn>x[i]) f[i]=maxlongint; else f[i]=f[queue[head]]+s[i]; if(f[i]<maxlongint&&f[i]>=k) { bk=true; break; } } if(bk) { ans=mid; r=mid-1; } else l=mid+1; } printf("%d\n",ans); return 0; }