这次考试考的都是往年noip的真题,难度也都是在2、3题左右,考试的成绩觉得还可以,只是最后一道题有点遗憾。
第一题扫雷,openjudge原题。比较简单就过了。第二题比例化简,当时出了一点小问题,但也比较轻松就解决了。主要的难点是第三题,当年noip普及组第三题:小朋友的数字。
第二题主要也就是注意两数相除,如果要保留小数,应先*1.0。
第三题最后讲过、改过之后还是没有AC。而且觉得自己的程序我还是没想通我的为什么会错。把最后八十的代码贴出来:
有 n 个小朋友排成一列。每个小朋友手上都有一个数字,这个数字可正可负。规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之和的最大值。 作为这些小朋友的老师,你需要给每个小朋友一个分数,分数是这样规定的:第一个小朋友的分数是他的特征值,其它小朋友的分数为排在他前面的所有小朋友中(不包括他本人),小朋友分数加上其特征值的最大值。
请计算所有小朋友分数的最大值,输出时保持最大值的符号,将其绝对值对 p 取模后输出。
/*上面是第三题的题目*/输入部分
#include <iostream>
#include <cstdio>
#include <algorithm>
long long a[1000100],b[1000100],c[1000100];
using namespace std;
int main()
{
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
long long n,p,maxx2=-10000000;
cin>>n>>p;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=0;
}
特征值处理
b[1]=a[1];
long long sum,maxx=a[1];
if (a[1]>0) sum=a[1];
else sum=0;
for(int i=2;i<=n;i++)
{
sum=sum+a[i];
if (sum>maxx) maxx=sum;
b[i]=maxx;
if (sum<0) sum=0;
}
分数处理
c[1]=b[1];
maxx=c[1];
c[2]=b[1]+c[1];
for(int i=3;i<=n;i++)
{
if(b[i-1]>0) c[i]=b[i-1]+c[i-1];
else c[i]=c[i-1];
}
if(maxx<c[n]) maxx=c[n]; //这里再进行比较,以防漏掉
cout<<maxx%p;
return 0;
}
第三题按照这种思路去做,最后两组会超时,也就是80。
事实告诉我们,noip并不是所有的题都那么难,但也不会给你所有的分。拼尽全力去拿你可以拿到的分,同时尽量避免因琐碎的细节失分、超时的情况。尽全力就好了。