wayne 发表于 2017-5-25 21:17:46

序列的翻转输出

题目虽然很简单。但我最好的结果也只是 执行时间 0.124s,内存消耗 1320 KB。求助。
而该题的提交排行榜上 有很多人的 执行时间是0.001s,很好奇是怎么做到的。

http://acm.timus.ru/problem.aspx?space=1&num=1001
附带我的代码,中规中矩,#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[])
{
    #define SIZE 128*1024
//这个SIZE值是反复尝试出来的
    double head;
    int cnt=0;
    long long input;
    while(scanf("%lld",&input)!=EOF){
      head = sqrt(input);
    }
    while(cnt>0){
      printf("%.4lf\n",head[--cnt]);
    }
    return 0;
}


wayne 发表于 2017-5-26 10:24:37

应该是网站的问题. 因为我又挑选了一道简单的题目. 发现 仍然是有一堆的 答案是0.001s,都是 intel C/C++ 的compiler


alt 发表于 2017-5-26 10:37:57

1.
while(scanf("%lld",&input)!=EOF){
      head = sqrt(input);
    }
这样的io操作中间最好不要有其他的操作?是不是可以提高io效率?

2. 必须要用sqrt()吗?sqrtf()行不行?只要求小数点后4位的精度。

3. printf("%.4lf\n",head[--cnt]);效率是不是比较低?最多要打印14560次

wayne 发表于 2017-5-26 13:10:17

alt 发表于 2017-5-26 10:37
1.
while(scanf("%lld",&input)!=EOF){
      head = sqrt(input);


1) 这样的IO是怎样的IO,可否详细说明 不利的地方
2) 因为题目说了输入是 long long 的范围. 如果用sqrtf, 将会发生 long long 截断转化成 float 型. 这个在 输入不是特别大的时候,能保证精度,当输入比较大的时候,超出了最大 int 的范围, 可能会在小数点后面出现误差.
3) 这个还有改进的地方吗? 因为题目要求是要打印出来的

gxqcn 发表于 2017-5-26 16:53:24

printf 输出十进制字符,内部估计需要大量的除法运算,若能优化一下收益肯定很大。
它要求精确到小数点后四位,可否避免用浮点算法,改用定点算法,甚至是整型替代浮点算法?当然代码量就上去了。。。

wayne 发表于 2017-5-26 17:58:16

gxqcn 发表于 2017-5-26 16:53
printf 输出十进制字符,内部估计需要大量的除法运算,若能优化一下收益肯定很大。
它要求精确到小数点 ...


Solved problems: show | hide•Sort by: id | authors | difficulty        Volume 2 →

ID        Title        Source        Authors        Difficulty
Ok        1000        A+B Problem                77032        17
Ok        1001        Reverse Root                22240        17
Ok        1068        Sum                27511        42
Ok        1025        Democracy in Danger        Autumn School Contest 2000        17652        71
Ok        1083        Factorials!!!        Spring School Contest 2001        14811        74

该题 在timus上 是 难度级别最低的,仅次于A+B Problem ,   所以应该不会到这个层次, :*-^
页: [1]
查看完整版本: 序列的翻转输出