2010 ccsu 第一次新手赛

来源:互联网 发布:软件游戏编程培训班 编辑:程序博客网 时间:2024/05/15 00:36

我们学校终于有 oj 啦!这次的比赛的题目由08级的队员出的。难度,嗯~,不是很难,当时是想让一般的人能做出个什么3、4道题,好一点的话,就应该能过7、8题吧,开始还以为09的OIer能够ak。但是这次的结果不是很理想,但是据了解,很多人知道题目的解法是这么回事,但就是写不出程序,这。。,语法没学好。总的来说,09级的选手们没发挥本能的水平吧。

下面说说这次比赛的题目吧:

A. (a^b)%c 。 解法:二分。 首先一条性质: (a*b)%c=((a%c)*(b%c))%c     然后,a^b: 当b为奇数时,可以分解为a^((b-1)/2)*a^((b-1)/2)*a; 当b为偶数时,可以分解为a^b/2*a^b/2。 于是可以看到a^b的形式可以慢慢地分解下去,于是按照这个原理就可以解决这个问题。 先想想如何实现这个问题,下面附一份关键代码以供参考:

while(b)    //b为指数
{
         if(b&1)  //b为奇数
             ans=ans*a%c;  //ans代表答案,初始值为1
        b>>=1;  //b/2;
        a=a*a%c;  //二分的关键!!!

}

 

B.方程求解。 解法:二分。 这道题本意是想考高数的知识,在大一上学期高数书的第三章第八节中就提到这个问题,有什么不懂的,建议去看高数书,学会这种算法很有用的,以后在很多问题中都会遇到。(注意精度,建议输出格式:prinf("%.3lf");)。

 

C.骨牌铺方格。 解法:递推。 相信很多人看题目中那个图,就会有点想法,是的,就是一个递推关系:f(x)=f(x)+f(x-1); 注意这题用递归的话就会超时,因为重复算了很多。于是这题就可以解决了。

 

D.黑色星期五。 解法:模拟。 简单的模拟,先把这一年,这个月之前的天数算出来,然后再与7对应,递增相应的星期几。贴一段关键代码吧:

for(int i=Y;i<=year;++i)
     for(int j=1;j<=12;++j)
     {
                   Count[(ans+13)%7]++;   //答案就保存在这里
                   ans+=Mdays[j];  //增加天数
                   if((j==2) && (((i%4==0)&&(i%100!=0))||(i%400==0)))
                      ++ans;  //闰年的二月多一天
    }

 

E.矩阵乘法。解法:直接算。刚学过线性代数,应该知道怎么算的,三重循环就解决了。也贴一段代码吧:

for(int i=1;i<=n;++i)
     for(int j=1;j<=n;++j)
     {
                  int temp=0;
                  for(int k=1;k<=m;++k)
                      temp+=m1[i][k]*m2[k][j];
                  ans[i][j]=temp;
     }

 

F.空心三角形。解法:模拟。这道题是最简单之一的题目,直接根据题目的情况输出。为简单起见,分为三部分:第一部分,输出第一行,把算一下第一行前面有几个空格,输出空格后就输出一个相应的字母,注意这一行后面就不要再输出空格了,发现很多同学多数出了空格导致一直“PE” 显示错误,后面的行也是一样。第二部分,输出前面的空格,输出一个字符,输出中间的空格,再输出最后一个字符。第三部分,输出最后一行字符。

 

G.三种不同颜色的球。解法:a+c+1。这次比赛最简单的题,还有些同学,没注意b等于0的情况而一直错。

 

H.神秘的功能。 解法:递推。这题还不需要推,题目已经给出了递推公式,直接根据题意去算,注意题目中说了:规定p mod q得到的整数r满足0 <= r <= q −1。这里要注意,要不可能会得到负值,建议p mod q 得到r 以后,再r=(r+q)%q,这样就可以避免出错。这题的公式都出来了,就不贴代码了。

 

I.杨辉三角。 解法:也是根据杨辉三角的性质去算。不难。

 

这次比赛的解题报告就写这些了,有什么问题可以问。这次大家可以说是普遍失误,多多做题,多多刷题,期待下次爆发!!!

 

原创粉丝点击