在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<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 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<len;i++) 12 { 13 sum=0; 14 if(a[i]==‘5‘||i==len-1) 15 { if((i==len-1)&&(a[i]!=‘5‘)) i++; 16 en=i; 17 for(int j=st;j<en;j++) 18 { 19 sum=sum*10+a[j]-‘0‘; //开始用pow,大数据会错 20 } 21 st=i+1; 22 if(i==0||a[i-1]==‘5‘)continue; 23 c[n++]=sum; 24 25 } 26 } 27 sort(c,c+n); 28 for(int p=0;p<n;p++) {cout<<c[p];if(p!=n-1)cout<<" ";} 29 cout<<endl; 30 } 31 return 0; 32 }
第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 3 2 10 20 |
Sample Output 1 8 22 |
AC代码:
1 #include<iostream> 2 #include<cstdio> 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<<sum<<endl; 17 } 18 return 0; 19 }
这水题第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