码迷,mamicode.com
首页 > 其他好文 > 详细

小细节汇总

时间:2018-06-03 10:50:21      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:col   width   情况   hdu   sam   tom   str   ++   c代码   

在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       —————今天又被自己菜醒

小细节汇总

标签:col   width   情况   hdu   sam   tom   str   ++   c代码   

原文地址:https://www.cnblogs.com/sinphone19/p/9127865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!