接下来就和大家分享一下这次考试值得反思(坑人)之处
1>第一题《恐怖的老师》
不知道为什么老师的名字叫虚伪,可能是虚伪本人出的题目吧;
题是很水的,但是敲起来小错误还是蛮多的;
先把题目放上来吧:
{【问题描述】
暑假开学了,同学们都迫不及待想分享自己暑假快乐的体验。可是,XW老师要维护安静的课堂秩序。他悄悄的打听到了一些消息:某个同学写的纸条,会给同一排,或者同一列的一位同学。最终,这张纸条的路线会形成一个矩形,又再次回到这位同学手里。XW老师已经默默的打听到了三个坐在线路拐弯处的同学A、B、C的位置。他希望你帮他找出,写纸条的同学的位置,来对他进行惩罚。
【输入】
第一行,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需要多少天才能爬出井。
【输入】
包括三个由空格分开的数字:A,B和V
【输出】
一个整数,表示小x爬出深井需要多少天
【输入输出样例1】
selfrescue.in
selfrescue.out
5 1 6
2
【输入输出样例2】
selfrescue.in
selfrescue.out
6 1 6
1
【数据范围】
1≤B<A≤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:难道4,250,22,38这些都是幸运数字
附上值得被吐槽的题目:
【问题描述】
小x有n个整数,他认为偶数是他的幸运数字,他想知道,这n个数里有多少个偶数,还想知道这些偶数的累加和是多少。
【输入】
第一行一个整数n n<=100
第二行,n个用空格分开的整数。每个数的大小不会超过100000
【输出】
第一行两个用空格隔开的整数S1和S2,表示偶数的个数和偶数的累加和
【输入输出样例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;
} //将c与b比较,弥补上面删除第一个最大值之后的数位位数
//貌似错在这里了,并不知道有什么错,可能是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里前面的题再仔细过一遍吧;
全文终。