NOIP2017普及组解题报告
刚参加完NOIP2017普及,只考了210,于是心生不爽,写下了这篇解题报告。。。(逃
第一次写博,望dalao们多多指导啊(膜
第一题score,学完helloworld的人也应该都会吧,之前好多人0分或60分据说是精度炸了,后面不是又重测了么233
直接给代码
#include <stdio.h> int a,b,c; double a1,b1,c1; int main() { scanf("%d %d %d",&a,&b,&c); a1=a*0.2; b1=b*0.3; c1=c*0.5; printf("%.lf",a1+b1+c1); return 0; }
许多人不会像我这么写而是除以10再去乘,毕竟都是是的整数倍
第二题librarian,这道题简单分析就考了个排序+取余,没什么技术含量,可是由于这个万恶的单词,有个原本265的大佬没拼对然后就gg到165,身边还有一个dalao第三题写了好多却只有十五分,然后第二题多打了个0然后内存就炸了。。。还有某位-1没有打\n。。。(同情
也是直接给代码吧
#include<stdio.h> #include<algorithm> #include<iostream> using namespace std; int a[1005]; int main() { int n,q,b,c,i,j,s=1,ss=0; scanf("%d%d",&n,&q); for(i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); for(i=0;i<q;i++) { scanf("%d %d",&b,&c); s=1;ss=0; for(j=1;j<=b;j++) s=s*10; for(j=0;j<n;j++) { if(a[j]%s==c) { printf("%d\n",a[j]); ss=1; break; } } if(ss==0)printf("-1\n"); } return 0; }
第三题…先给题目吧
这道题当我看题目时感觉挺简单的,只是觉得是一个普通的dfs+剪枝,可是当真正写的时候就不知道从何写,如何剪枝,然后调试了1小时。。。未果,注释矣。。。
之后,我写了一个单纯的dfs,纯搜,然后水了65分,代码如下
#include <stdio.h> int m,n,i,sign=false,a[1001][1001],x,y,color; long long ans=23333333333333; void dfs(int x1,int y1,int magic,int money,int w_i_c)//w_i_c=What is the color? { if(x1==m&&y1==m) { if(money<ans) ans=money; return ; } else { if(!magic)//当未施展魔法时 { if(x1+1<=m)//判边界条件 { if(a[x1+1][y1]>0)//当有颜色时 { if(a[x1][y1]==a[x1+1][y1]) dfs(x1+1,y1,0,money,-1); if(a[x1][y1]!=a[x1+1][y1]) dfs(x1+1,y1,0,money+1,-1); }//只需考虑颜色的变换 else if(a[x1+1][y1]==0) dfs(x1+1,y1,1,money+2,a[x1][y1]); } if(y1+1<=m) { if(a[x1][y1+1]>0) { if(a[x1][y1]==a[x1][y1+1]) dfs(x1,y1+1,0,money,-1); if(a[x1][y1]!=a[x1][y1+1]) dfs(x1,y1+1,0,money+1,-1); } if(a[x1][y1+1]==0) dfs(x1,y1+1,1,money+2,a[x1][y1]);//颜色就为上一个的颜色 }//同上 } else//当施展过魔法 { if(a[x1+1][y1]!=0) { if(a[x1+1][y1]==w_i_c) dfs(x1+1,y1,0,money,-1); if(a[x1+1][y1]!=w_i_c) dfs(x1+1,y1,0,money+1,-1); } if(a[x1][y1+1]!=0) { if(a[x1][y1+1]==w_i_c) dfs(x1,y1+1,0,money,-1); if(a[x1][y1+1]!=w_i_c) dfs(x1,y1+1,0,money+1,-1); } } } } int main() { scanf("%d %d",&m,&n); for(int i=1;i<=n;i++) { scanf("%d %d %d",&x,&y,&color); a[x][y]=color+1;//其余为0表示无色,+1保证非负性 } dfs(1,1,0,0,-1);//分别代表横坐标,纵坐标,是否施展♂过魔♂法,钱,颜色;-1是一个特殊值 if(ans==23333333333333) printf("-1");//如果达到这个值就代表ans没有改变,说明到不了终点 else printf("%d",ans); return 0; }
第四题说实话没怎么看懂…
粘上一个小学生20分的代码吧。。。
#include<stdio.h> int sco[500001]={0},dis[500001]={0}; int main() { int i,j,k,n,d,ans=0,flag,start; scanf("%d%d%d",&n,&d,&k); for(i=1;i<=n;i++) { scanf("%d%d",&dis[i],&sco[i]); } int sum=0; for(i=1;i<=n;i++) { if(sco[i]>0) { sum+=sco[i]; } } if(sum<k) { printf("-1"); return 0; } flag=1; while(1) { sum=0;start=0; ans++; if(ans<d) { for(i=1;i<=n;i++) { if(sco[i]>0&&dis[i]-start>=d-ans&&dis[i]-start<=d+ans) { sum+=sco[i]; start=dis[i]; if(sum>=k) { printf("%d",ans); return 0; } } } } else { for(i=1;i<=n;i++) { if(sco[i]>0&&dis[i]-start>=1&&dis[i]-start<=d+ans) { sum+=sco[i]; start=dis[i]; if(sum>=k) { printf("%d",ans); return 0; } } } } } }
今天就到这里,以后我会多多写博,把自己的意见与大家分享,有不解或志同道合者可以加qq:2396389683,再见