这次考试在衢州二中,这里地形太复杂了,离开考前3分钟才找到考场。无语·········所以一开考就没有好心情。这次的题目相对来以往的前几道题比较简单,但最后一道题比较难,考场上只想出来了50分的代码。
时间限制:1s 内存限制:256M
第一题:成绩 score
超级水题,NOIP史上最简单的题没有之一,只要c++如果入门的都会做,普通的运算符操作
难度:☆☆☆☆☆ (入门难度)
民间数据:100分
官方得分:100分
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
int ans;
int main()
{
freopen ("score.in","r",stdin);
freopen ("score.out","w",stdout);
scanf ("%d %d %d",&a,&b,&c);
ans=a/5+b/10*3+c/2;
printf ("%d",ans);
return 0;
}
这道题对于c++的选手有一个无法避免的误差,就是使用浮点数(float || double)是直接*0.3会出现t.9999999999········的情况。e.g. :10.0*0.3=2.9999999·····
这导致一些选手出现 printf (”%d”,int (ans))使结果少一,60分
第二题:图书管理员 librarian
这道题其实也不难,暴力的时间复杂度也只有O(n*q)==O(1000000),而且图书编码与需求码都用 int 存的下,唯一的难点就是判断末尾是否相等,需要一定的代码能力
难度:★☆☆☆☆ (普及-)
难点:check 处理
民间数据:100分
官方成绩:100分
#include<bits/stdc++.h>
using namespace std;
int n,q;
int a[1010];
int main()
{
freopen ("librarian.in","r",stdin);
freopen ("librarian.out","w",stdout);
scanf ("%d%d",&n,&q);
for (int i=1;i<=n;i++)
scanf ("%d",&a[i]);
sort (a+1,a+n+1); //c++ STL
for (int i=1;i<=q;i++)
{
int l,x;
bool flag=0;
scanf ("%d %d",&l,&x);
int t=pow (10,l); //计算t 即末尾0的个数
for (int i=1;i<=n;i++)
if ((a[i]-x)%t==0) //重点:若x是a[i]的位数,那么(a[i]-x)%t==0
{
flag=1;
printf ("%d\n",a[i]);
break;
}
if (!flag)
printf ("-1\n");
}
return 0;
}
这道题可以有变式,就是将字典编码长度与查询码长度最大为100(注意是长度,不是数值),这样对于排序就有点难了。
第三题:棋盘 chess
难度:★★☆☆☆ (普及刚好)
民间数据:100分
官方数据:100分
这道题代码量还是挺大的,考试时用记忆化搜索做的,但据说最好的解决方案是广度优先搜索,