博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小细节汇总
阅读量:5044 次
发布时间:2019-06-12

本文共 2100 字,大约阅读时间需要 7 分钟。

在ACM题目中,尽量减少函数调用,减少开销。

1.<cmath>头文件中的pow函数再返回大数据的时候,会出现与标准答案相差-+1的情况(很坑!!),大数据尽量不要用,最好的方法是手写,以hdoj的ACM steps里一道水题为例:         

                  排序

Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
 
Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
 
Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
 
Sample Input
0051231232050775
 
Sample Output
0 77 12312320
 
 
Source
POJ
 
Recommend
Eddy

本人AC代码:

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 char a[1002]; 7 int c[1002]; 8 int main() 9 { while(~scanf("%s",a))10 { int i,len=strlen(a),sum=0,st=0,en=0,n=0;11 for(i=0;i

第19行处,开始写的是sum+=pow(10,XXXX...);

用pow最后结果可能会出现29999999而答案是30000000的情况,所以还是手写比较安全可靠^_^

 

 

2.<cmath>中的sqrt函数虽然好用,但会减缓运行速度:

水题(hdoj ACM steps 2.1.4):

                  七夕节

七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:
数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.
你想知道你的另一半吗?
 
Input
输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000).
 
Output
对于每组测试数据,请输出一个代表输入数据N的另一半的编号.
 
Sample Input
321020
 
Sample Output
1822

AC代码:

1 #include
2 #include
3 using namespace std; 4 int t,x; 5 int main() 6 { cin>>t; 7 while(t--) 8 { int sum=1; 9 cin>>x;10 for(int i=2;i*i<=x;i++)    //初始:i<=sqrt(x);11 {12 if(x%i==0) {sum+=i;13 if(i*i!=x) sum+=x/i;}14 15 }16 cout<
<

这水题第10行我用sqrt写竟然TLE你敢信??????

所以说能少用尽量少用吧。

 

3.printf和scanf的输入输出速度比cin和cout快。

这个似乎是个不成文的规定,各大教辅书上几乎都是printf和scanf写的,似乎有大神曾经测算过,printf比cout快了0.0001秒(数据我口胡的,总之很小就对了),以前做过一道玄学题目,用cin和cout会TLE但是printf和scanf就过了。

总之算法感觉没问题,居然TLE的时候尝试把cin和cout改成printf和scanf试试,说不定就AC了呢~

 

 

                                                  2018.6.3       —————今天又被自己菜醒

转载于:https://www.cnblogs.com/sinphone19/p/9127865.html

你可能感兴趣的文章