{2018.4.12}荀(gou)彧(huo)同学的第一次考试小总结



接下来就和大家分享一下这次考试值得反思(坑人)之处

1>第一题《恐怖的老师》

不知道为什么老师的名字叫虚伪,可能是虚伪本人出的题目吧;

题是很水的,但是敲起来小错误还是蛮多的;

先把题目放上来吧:

{【问题描述】

   暑假开学了,同学们都迫不及待想分享自己暑假快乐的体验。可是,XW老师要维护安静的课堂秩序。他悄悄的打听到了一些消息:某个同学写的纸条,会给同一排,或者同一列的一位同学。最终,这张纸条的路线会形成一个矩形,又再次回到这位同学手里。XW老师已经默默的打听到了三个坐在线路拐弯处的同学ABC的位置。他希望你帮他找出,写纸条的同学的位置,来对他进行惩罚。

【输入】

第一行,6个整数x1,y1,x2,y2,x3,y3表示ABC三个同学在哪一排,哪一列。

 

【输出】

用空格分开的两个数 x4,y4,表示写纸条同学的位置。

 

【输入输出样例1

teacher.in

teacher.out

1 1 3 1 1 3

3 3

 

样例解释:

三个同学的位置分别是:第一排第一列,第三排第一列,第一排第三列。

【数据范围】

  0<x1,y1,x2,y2,x3,y3 <=10^9

思考的方式很简单,所以说很水嘛,但是还是很容易犯错误的;

接下来附上荀彧同学的代码:

#include<bits/stdc++.h>

using namespace std;

int main()

{

int x1,x2,x3,y1,y2,y3,x4,y4;

cin>>x1>>y1>>x2>>y2>>x3>>y3;

if(x1==x2)   x4=x3;

if(x1==x3)   x4=x2;

if(x3==x2)   x4=x1;

if(y1==y2)   y4=y3;

if(y1==y3)   y4=y2;

if(y3==y2)   y4=y1;

cout<<x4<<''<<y4<<endl;

return 0;

}

非常简单的代码,就是不停的比较然后赋值;

荀彧同学虽然难得把if语句里的相等敲了双等号,但是;

不知道为什么脑子进水把if语句后的赋值也敲成了双等号;

编译当然是没毛病的;

但是运行程序的时候output当然是错了;

还好后来脑子转过弯来;

意识到了赋值只需要一个等号;

浪费了五分钟吧;

也是一种教训;

毕竟第一次打比赛肯定会有些紧张;

晚上刘老师又讲了另外一种做法;

不要太简单;

下面附上代码(代码来自余炳亮同学):

#include<bits/stdc++.h>;

using namespace std;

int main()

{

      intx1,y1,x2,y2,x3,y3;

      cin>>x1>>y1>>x2>>y2>>x3>>y3;

      intx4,y4;

      x4=x1^x2^x3;

      y4=y1^y2^y3;

      cout<<x4<<""<<y4;

      return0;

}

用了^抑或这个东西,还是需要自己到度娘那里去问清楚的;

Csdn中很多大佬的博客上有抑或的详解;

荀彧同学在这里就不多说了;

end…

2>第二题《小x的自救》

今天的题目的人名都非常值得吐槽;

看到题目内心os:这不是小学奥数题吗?这不是那只一直渴望爬出井底的蜗牛吗?怎么今天变成了小x同学?

下面附上值得一吐槽的题目:

【问题描述】

   x在成功的训练了5条鱼之后,在回家的路上,掉进了一个深井中。小x在深井里找到一套爬出来的装备,但是装备很重。

   已知深井深度为v米,小x每天白天往上爬a米,但是晚上睡觉的时候,小x会可怜的向下滑b米。

   求小x需要多少天才能爬出井。

【输入】

包括三个由空格分开的数字:ABV

【输出】

一个整数,表示小x爬出深井需要多少天

 

【输入输出样例1

selfrescue.in

selfrescue.out

5 1 6

2

 

【输入输出样例2

selfrescue.in

selfrescue.out

6 1 6

1

 

【数据范围】

  1≤BA≤V≤1 000 000 000

不知道五条鱼和这道题有什么关系,但还是耐心的看完了;

开始在草稿本上用数学做法做这道题;

然后列出了一个诡异的不等式;

当然,荀彧同学没有智障到直接把不等式放到代码里;

而是老老实实的开始了分类讨论;

附上第一次只拿了20分的代码:

#include<bits/stdc++.h>

using namespace std;

int main()

{

      inta,b,v,t;

      cin>>a>>b>>v;     

      if(a>=v)   t=1; //这里还是没有问题的;

      else

      {

             if(v%(a-b)==0)//这里就出现问题了,需要讨论的是(v-a%a-b),而非这个;  t=v/(a-b);//由于上一步的错误导致这里也出现了问题;

             else   t=v/(a-b)+1;//这里的错误是同理;

      }

      cout<<t<<endl;

   return 0;

}

看起来似乎没有毛病,但是批注中已经写明白了错误的根源,最后一次爬上时不会滑下来;

课后,在应雨豆同学的讲解下,荀彧同学明白了自己的错误,并且敲出了正确的代码(在这里对应雨豆同学表示十分的感激);

附上100分的正确代码:

#include<bits/stdc++.h>

using namespace std;

int main()

{

      inta,b,v,t;

      cin>>a>>b>>v;     

      if(a>=v)   t=1;

      else

      {

             if((v-a)%(a-b)==0)   t=(v-a)/(a-b)+1;

             else   t=(v-a)/(a-b)+2;

      }

      cout<<t<<endl;

   return 0;

}

又是水题一道,但是是非常容易被坑的;

说白了还是小学数学没学好呢;

还是要好好认真的数学作斗争;

end…

3>第三题《幸运数字>

再次说明水题一道

又是小x同学,以为偶数是自己的幸运数字

荀彧同学内心os:难道42502238这些都是幸运数字

附上值得被吐槽的题目:

【问题描述】

xn个整数,他认为偶数是他的幸运数字,他想知道,这n个数里有多少个偶数,还想知道这些偶数的累加和是多少。

 

【输入】

 第一行一个整数n<=100

 第二行,n个用空格分开的整数。每个数的大小不会超过100000

【输出】

 第一行两个用空格隔开的整数S1S2,表示偶数的个数和偶数的累加和

【输入输出样例1

evennum.in

evennum.out

3

1 2 3

1 2

 

 

【输入输出样例2

evennum.in

evennum.out

3

1 3 5

0 0

 

【数据范围】

  n<=100

  保证输入的每个数的大小不会超过100000

看到这道题目的荀彧同学还是开心了一下的;

毕竟刚刚学了数组;

脑子里还是热乎着的;

不多说,直接附上100分代码:

#include<bits/stdc++.h>

using namespace std;

int main()

{

      inta[110],n,sum=0,m=0;

      cin>>n;

      for(inti=1;i<=n;i++)

      {

             cin>>a[i];

             if(a[i]%2==0)

             {

                    m++;

                    sum+=a[i];

             }

             

      }

      cout<<m<<''<<sum<<endl;

      return0;

}

这是荀彧同学认为老师也这么认为的最简单的最水的一道题目;

难得会做啊;

基础知识很重要;

一次考试中总会有很水恨水的基础题;

end…

4>第四题《最大值和次大值》

看到题目以前一半还是蛮高兴的,毕竟求最大值,谁不会啊;

看到后面一半,心凉了半截,次大值,什么鬼?

不管他,看完题目上手敲代码;

先敲了一个求最大值的,编译运行没有毛病;

但是对于次大值就真的束手无策了;

这次考试大半时间浪费在求次大值上;

然而还是没有求出来;

附上0分代码:

#include<bits/stdc++.h>

using namespace std;

int main()

{

int a[110],maxx1=-100000,maxx2=-100001,n,b,c;

cin>>n;

for(int i=0;i<n;i++)

{

       cin>>a[i];

   if(a[i]>maxx1)

       {

              maxx2=maxx1;

              maxx1=a[i];

              b=i+1;

       }

if((a[i]>maxx2)&&(a[i])<maxx1)

{

       maxx2=a[i];

       c=i;

}

}

cout<<maxx1<<''<<b<<endl;

cout<<maxx2<<''<<c<<endl;

return 0;

}

到现在还是不知道自己错在哪里;

当时考试的时候还用一种思路;

附上不完全代码:

#include<bits/stdc++.h>

usingnamespace std;

intmain()

{

int a[110],maxx1=-100000,max1,max2,n,b,c;

cin>>n;

for(int i=1;i<=n;i++)

{

       cin>>a[i];

   if(a[i]>maxx1)

       {

              maxx1=a[i];

              max1=maxx1;

              b=i;

       }

}

cout<<max1<<''<<b<<endl;

for(int i=b;i<n;i++)

       a[i]=a[i+1];

       n--; //删除数组中的最大值

       {

              for(int l=1;l<=n;l++)  //在接下来的数组中寻找最大值

              if(a[l]>maxx1)

              {

                      maxx1=a[l];

                      max2=maxx1;

                      c=l;

                      {

                             if(c>=b)c+=1;

                             if(c<b) c=c;

                            } //cb比较,弥补上面删除第一个最大值之后的数位位数

                             //貌似错在这里了,并不知道有什么错,可能是a[i]没有int,但是就是不知道错哪里

                             //希望岳老师帮忙看一看

              }

       }

cout<<max2<<''<<c<<endl;

   return 0;

}

后来晚上讲题的时候问了章晟大佬这种做法;

思路其实也不是不可以;

但是代码没敲对;

然后运行会超时;

但也不失是一个很有意思的做法;

毕竟荀彧同学水嘛;

高级做法不会做;

只能用最若鸡的做法来做;

后来看了王鸿晟的代码(感谢团支书同学);

这是建立在我的理解水平上能看懂的代码了;

才明白赋值这个东西再一次坑了我自己;

没有赋值;

内心绝望;

附上最后修改过的100分的代码:

#include<bits/stdc++.h>

usingnamespace std;

intmain()

{

int a[110],maxx1=-100000,maxx2=-100000,n,b,c;

cin>>n;

for(int i=1;i<=n;i++)

{

       cin>>a[i];

   if(a[i]>maxx1)

       {

              maxx1=a[i];

              b=i;

       }

   }

cout<<maxx1<<''<<b<<endl;

a[b]=0;

for(int i=1;i<=n;i++)

{

       if(a[i]>maxx2)

       {

              maxx2=a[i];

              c=i;

       }

}

cout<<maxx2<<''<<c<<endl;

return 0;

}

做完这道题收获还是蛮大的;

知道了敲一个程序可以有很多思路;

知道了代码可以如何优化;

这是虽然虚伪掉了我很多时间但是非常有用的一道题;

值得纪念;

end…

5>最后第五题第六题不再荀彧同学的理解范围之内;

在这里就不再作过多的说明;

希望这次长长的博客对自己的计算机信奥生涯能有点帮助吧;

220分,班级40,实在是有点弱了;

以后不能再水题了;

教训是有的;

但是更多的是收获;

有空把oj里前面的题再仔细过一遍吧;

全文终。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值