好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

noipxx普及组解题报告.docx

13页
  • 卖家[上传人]:bin****86
  • 文档编号:59714300
  • 上传时间:2018-11-11
  • 文档格式:DOCX
  • 文档大小:20.32KB
  • / 13 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划noipXX普及组解题报告  NOIPXX普及组解题报告  From贴吧idu007zzt  金币  国王将金币作为工资,发放给忠诚的骑士  第一天骑士收到一枚金币;之后两天,每天收到两枚金币;之后三天,每天收到三枚金币;之后四天,每天收到四枚金币,以此类推;这种工资发放模式会一直延续下去,当连续N天收到N枚金币后,骑士会在之后的N+1天,每天收到N+1枚金币  请计算前K天里,骑士一共获得了多少金币  输入格式  输入包含一个正整数K,表示发放金币的天数  输出格式  输出一个正整数,即骑士收到的金币数  样例1  样例输入1  6  样例输出1  14  样例2  样例输入2  1000  样例输出2  29820  对于全部数据,1≤K≤10000  这种题目,简直就属于水题狂做的那种不多说,附C++代码  #include""  intk,ans=0;  intmain(){  freopen("","r",stdin);  freopen("","w",stdout);  scanf("%d",&k);  inti=1;  while(k){  if(k>=i){  ans+=i*i;  k-=i;  }else{  ans+=k*i;  k=0;  }  i++;  }  printf("%d\n",ans);  return0;  }  扫雷游戏  扫雷游戏是一款十分经典的单机小游戏。

        在n行m列的雷区中有一些格子含有地雷,其他格子不含地雷  玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格  游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格  现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数  注:一个格子的周围格子包括其上、下、左、右、左上、左下、右上、右下八个方向上与之直接相邻的格子  输入格式  第一行用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数接下来n行,每行m个字符,描述了雷区中的地雷分布情况字符?'表示相应的格子是地雷格,字符(?)`表示相应的格子是非地雷格子相邻字符之间无分隔符  输出格式  输出文件包括n行,每行m个字符,描述了整个雷区用?表示地雷格,用周围地雷格数表示非地雷格相邻字符之间无分隔符  样例1  样例输入1  33  *??  ???  ?*?  样例输出1  *10  221  1*1  样例2  样例输入2  23  ?*?  *??  样例输出2  2*1  *21  对于所有的数据,1≤n≤100,1≤m≤100  又是水题一道,请允许我吐槽一下pj组的难度……别的没什么,注意字符的读入。

      附C++代码  #include""  usingnamespacestd;  intmatrix[105][105];  charstr[105];  intdir[3]={0,1,-1};  intn,m;  intmain(){  freopen("","r",stdin);  freopen("","w",stdout);  scanf("%d%d",&n,&m);  inti,j,k,t;  for(i=1;i  intn,m,i,j,x,y,a[55][55];  intmain(){  scanf("%d",&n);m=n*n;x=1;y=(n+1)/2;a[x][y]=1;  for(i=2;i  #include  #defineN  usingnamespacestd;  intn,i,tm,tp,now,ans,sz,to[N],dfn[N],low[N],st[N];boolis[N];  voiddfs(intx){  dfn[x]=low[x]=++tm;st[++tp]=x;is[x]=1;  inty=to[x];  if(!dfn[y])dfs(y),low[x]=min(low[x],low[y]);  elseif(is[y])low[x]=min(low[x],dfn[y]);  if(low[x]==dfn[x]){  for(sz=now=0;now!=x;)now=st[tp--],sz++;  if(sz>1)ans=min(ans,sz);  }  }  intmain(){  for(ans=1e9,scanf("%d",&n),i=1;i  #include  #include  #definemxh  usingnamespacestd;  intans,T,n,i,x,y,pai[6],cnt[15];  voidfind(intstep){  inti,j,k,w;  if(step>=ans)return;  ans=min(ans,step+pai[1]+pai[2]+pai[3]+pai[4]);  if(pai[4])for(i=2;i1){pai[cnt[j]]--;cnt[j]-=2;pai[cnt[j]]++;for(k=j;k1){pai[cnt[k]]--;cnt[k]-=2;pai[cnt[k]]++;find(step+1);pai[cnt[k]]--;cnt[k]+=2;pai[cnt[k]]++;}pai[cnt[j]]--;cnt[j]+=2;pai[cnt[j]]++;}pai[4]++;cnt[i]+=4;}if(pai[3])for(i=2;i=3){pai[cnt[i]]--;cnt[i]-=3;pai[cnt[i]]++;find(step+1);for(j=1;j1){pai[cnt[j]]--;cnt[j]-=2;pai[cnt[j]]++;find(step+1);pai[cnt[j]]--;cnt[j]+=2;pai[cnt[j]]++;}pai[cnt[i]]--;cnt[i]+=3;pai[cnt[i]]++;}if(pai[3]+pai[4]>=2)for(i=3;i=3&&cnt[i+1]>=3){pai[cnt[i]]--;cnt[i]-=3;pai[cnt[i]]++;w=i;for(j=i+1;cnt[j]>=3&&j=3)for(i=3;i=2&&cnt[i+1]>=2&&cnt[i+2]>=2){pai[cnt[i]]--;cnt[i]-=2;pai[cnt[i]]++;  pai[cnt[i+1]]--;cnt[i+1]-=2;pai[cnt[i+1]]++;w=i+1;  for(j=i+2;cnt[j]>=2&&j=5)for(i=3;i  intL,n,m,i,w,l,r,mid,pos,ans,a[55555];  boolok(intx){  for(pos=w=0,i=1;i>1))ans=mid,l=mid+1;elser=mid-1;  printf("%d",ans);  }  【时间复杂度】O(nlgL)【空间复杂度】O(n)  【思想难度】30【编程难度】23【总用时】10min  T5子串  【题目大意】有两个字符串A和B。

      现在要从字符串A中取出k个互不重叠的非空子串,然后把这k个子串按照其在字符串A中出现的顺序依次连接起来得到一个新的字符串,问有多少种方案可以使得这个新串与字符串B相等?A的长度≤1000,B的长度≤200,k≤200  【解题说明】  特殊的10分做法:k=1,所以直接扫一遍判断就可以了  特殊的20分做法:k=2,所以枚举分隔点再扫一遍判断就可以了  特殊的20分做法:k=m,所以从前往后扫一遍DP统计一下方案就可以了  70分做法:考虑dp,用f[i][j][k]表示A串匹配到第i个字符,B串匹配到第j个字符,已经取了k个互不重叠的非空子串的方案数,那么f[i][j][k]=Σf[i-w-o][j-w][k-1](w=1-A[i]和B[j]的最大后缀匹配,i-w-o>=0),f[0][0][0]=1,这样直接转移的复杂度是O(nm^3k)的,把o这一维前缀和转移一下,就是O(nm^2k)的,可以通过70分的数据  90分做法:再把w也前缀和转移掉,就可以通过90分的数据  100分做法:加一个滚动数组,然后再卡一卡常,就可以通过100分的数据  【代码】  1.金币  (/c/pas)  国王将金币作为工资,发放给忠诚的骑士。

      第一天,骑士收到一枚金币;之后两天,每天收到两枚金币;之后三天,每天收到三枚金币;之后四天,每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币  请计算在前K天里,骑士一共获得了多少金币  【输入格式】  输入文件名为  输入文件只有1行,包含一个正整数K,表示发放金币的天数  【输出格式】  输出文件名为  输出文件只有1行,包含一个正整数,即骑士收到的金币数  【输入输出样例1】  见选手目录下的coin/和coin/输入输出样例1说明】  骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币因此一共收到1+2+2+3+3+3=14枚金币  【输入输出样例2】  见选手目录下的coin/和coin/  【数据说明】  对于100%的数据,1≤K≤10,000  【思路】枚举代码】  ViewCode  2.扫雷游戏  扫雷游戏是一款十分经典的单机小游戏在n行m列的雷区中有一些格子含有地雷,其他格子不含地雷玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。

      游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格  现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子  【输入格式】  输入文件名为  输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数  接下来n行,每行m个字符,描述了雷区中的地雷分布情况字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格相邻字符之间无分隔符  【输出格式】  输出文件名为  输出文件包含n行,每行m个字符,描述整个雷区用’*’表示地雷格,用周围的地雷个数表示非地雷格相邻字符之间无分隔符  见选手目录下的mine/和mine/  输入输出样例2】见选手目录下的mine/和mine/输入输出样例3】  见选手目录下的mine/和mine/  【数据说明】对于100%的数据,1≤n≤100,1≤m≤100  【思路】  枚举+统计代码】  ViewCode  3.求和  (/c/pas)  一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n每个格子上都染了一种颜色,并且写了一个数字number。

        定义一种特殊的三元组:。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.