小毅儿提示您:看后求收藏(二千零一十九年ACM一十月末总结,点醒梦中人,小毅儿,笔趣阁),接着再看更方便。
请关闭浏览器的阅读/畅读/小说模式并且关闭广告屏蔽过滤功能,避免出现内容无法显示或者段落错乱。
下面是我进大学以后第一次进队(ACM:一种全国性的计算机比赛)后,进行了第一次模拟比赛,一开始大一进队一共有50个人,到了现在(不到一年),仅剩23个人了(现在的大二还剩7个人)。
当时的我是真正意义上的小萌新,看看当时写的总结,还是挺有感慨的。。。
......
2019年ACM10月末总结
从开学到现在,来到队里也有蛮长时间的了,也迎来了队内的第一次正规的模拟比赛,心情说不紧张肯定是假的,但在真正开始比赛的期间,紧张感,压迫感,是加大还是减少,谁又能说的清楚,反正赛已经比完了,结局已定,往事不堪回首……
但回顾这些日子以来,自己从编程零基础到现在C语言的知识已经基本掌握(C++的知识点大部分也都会),看着一行一行代码从自己手中产生,再一个删除键从眼前消失,细细回想好像真的码下了不少代码。
废话不多说,这个比赛的主旨还是巩固自己不会的知识点,还是让代码来说话更能体现这篇总结最根本的价值吧。
下面是对这次比赛的一些解析,如果对这方面不敢兴趣的人,可以直接跳过这部分,看最后的总结。。。(如果不感兴趣:题目1001-1006,直接跳到1006解析那里就可以了)
头文件我就省了,不然占了不少行。。。
1001.qp师哥的亲切关怀,最水的题
这道题一开始就错了,而且错了两次(自己表示心态受到了影响),看到是最水的题自己都做不出来,还是蛮难过的(不过到了最后还好,别人也做不出来)。
代码
intin()
{
dble,b;
>>>b;
(1t<<int(*b+1e-8)<<endl;
(2)int=*b;
retrn0;
}
0.58100
57(如果不加1e-8的话,就会出现精度损失)
Prgrendedithexide:0
知识点
(1)最重要的:精度问题
(2)以前也有专门研究过,就是关于四舍五入到百分位或是十分位,跟直接取整数部分的一些区别,我觉得还是比较有用的。
先说这道题的直接取整数吧,答案直接用int直接转换,没什么可以说的。
再说关于四舍五入的问题(以四舍五入到百分位为例):
1.在输出时直接控制就行(例printf(“%6.2d”,),或者直接把那个6去掉printf(“%.2d”,),这两种都是可行的,是四舍五入,而不是直接舍去百分号之后的部分。
2.在大量数据都需要控制的时候用到下图的绿色字体
intin()
{
dble=1.666;
(2);
retrn0;
}
1.67
Prgrendedithexide:0
3.当然还有更正宗的解法(以ney为例)
ney=ney*100+0.5;
ney=(int)(ney);将ney乘100加上0.5后的值取整
ney/=100;
第一种方法在需要大量小数运算的情况下容易损失精度,这三种方法应当灵活运用。
1002.第几天
这道题在超时一次后就过了(在刚W掉1001两次之后,又超时了简直心态爆炸),不过还好bg让我在最短时间内找出来了。
下面直接附上自己的代码(如果大佬们有其他的,更好的,更简单的可无视我的)
代码
int[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
vidjdge(intx)
{
if(x%400==0||(x%4==0&p;&p;x%100!=0))
{
[2]=29;
}
else[2]=28;
}
intin()
{
std::is::sy_ith_();
intx,y,z,s;
hile(nf(“%d/%d/%d“,&p;x,&p;y,&p;z)!=EOF)因为一开始用的都in,这次有/,换用nf输入,却没有加!=EOF,让它坑了自己一把,因为超时,我还加了一行std::is::sy_ith_(),当然如果我不加!=EOF的话没什么卵用
{
s=0;
jdge(x);
fr(inti=1;i<=y-1;i++)
{
s=s+[i];
}
s=s+z;
}
retrn0;
}
错误分析
in与nf转换之间不熟悉,hile的括号内in用习惯了,不加!=EOF,但在使用nf的情况下切记不可马虎。(因为这道题比较简单就不详解了)
1003.你能找到这个数字么
错误分析
(我是从头开始一道一道题做的)好吧,我承认我做不出这道题来。(一直到最后也没A出来)
在经历了四次超时后,当别人都A出好几题来的时候,当时间缓慢爬过一个多小时之后,我仍在做1003,自认为是简单题,可能这就是高估自己能力的代价吧。
啊,多么痛的领悟~~
啊,我想哭但是哭不出来~~
回顾一下我是怎么说服自己在超时一次后又把代码交上的
(1)三个fr循环都是500的,肯定超时啦(我没考虑到,能力有限)
(2)所以第二次我就简单的加入了一行std::is::sy_ith_();
思想简单的我以为这就行了,所以再挂一次。
(3)第三次我又in全都转换为nf,t全都转化为printf,以为这样能过,好吧是我单纯了。
(4)第四次,我终于长了点心眼从自己的程序入手,看能不能简化(自认为超时的程序是对的,毕竟样例过了,好吧,样例过了的,程序错的时候大有时候),我把程序中加入了brek终止,以为这样可以阻止超时,当然现在看透一切的我对以前的我起不了任何歹心,毕竟是自己蠢。
在四次超时后,我实在是想不出任何办法了,才做的下一题(差距就此产生)
代码(在讲过之后又错了2次)
#ilde
#ilde
#ilde
singnesestd;
int[505],b[505][505],d[250005];
intin()
{
intL,N,M;
int=0;(不能写在hile里,不然的值在每次循环都会变为0;
hilein>>L>>N>>M)
{
fr(inti=1;i<=L;i++in>>[i];
fr(inti=1;i<=N;i++in>>b[i];
fr(inti=1;i<=M;i++in>>[i];
inttt=0;
fr(inti=1;i<=L;i++)
{
fr(intj=1;j<=N;j++)
{
d[++tt]=[i]+b[j];
}
}
srt(d+1,d+1+tt);
intS;
>S;
intn;
fr(inti=1;i<=S;i++)
{
>n;
ints=0;
fr(intj=1;j<=M;j++)
{
int=ler_bnd(d+1,d+1+tt,n[j])-d;
if(d[]==n[j])
{
s=1;
brek;
}
}
if(s==0t<<“NO“<<endl;
}
}
retrn0;
}
知识点
(1)还是对++i和i++的理解不够
[j++]=I相当于[j]=I;j++;
d[++tt]=[i]相当于tt++;d[tt]=[i];
以前我总是分开用,在括号内刚一看见还是有些不太习惯(人总得去适应不是)。
(2)关于ler_bnd()和pper_bnd()的常见用法
(当时师哥在讲ler_bnd的时候我就是半懂非懂,果然要是用在实际编码上,我这个半吊子水平立马漏出了原形。从此得出真理:古人诚不欺我,实践才是检验真理的唯一标准,)
本章未完,点击下一页继续阅读。