在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 #include2 #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):
七夕节
七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" 人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下: |
Input 输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000). |
Output 对于每组测试数据,请输出一个代表输入数据N的另一半的编号. |
Sample Input 321020 |
Sample Output 1822 |
AC代码:
1 #include2 #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 —————今天又被自己菜醒