找回密码
 欢迎注册
楼主: litaoye

[求助] 关于一个运算优化的问题

[复制链接]
发表于 2009-3-17 07:57:57 | 显示全部楼层
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-17 21:44:12 | 显示全部楼层
我使用分治法,解这道题的运行时间是 0.406 秒。
完整的 C# 源程序请参见:
Timus 1318. Logarithm
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-17 23:26:46 | 显示全部楼层

http://acm.timus.ru/很好的网站啊,我收藏了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-18 09:36:48 | 显示全部楼层
我按73# 方法,105#的数据写了一下,是0.109
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-18 09:54:25 | 显示全部楼层
要看提交到上面的成绩

现在俺不相信上面的数据了
肯定是可以针对其数据作假的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-18 11:40:46 | 显示全部楼层
134楼的那个小朋友很像我的侄女,一样精灵可爱,呵呵
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-18 11:45:23 | 显示全部楼层


你的头像足够精灵可爱的了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-18 11:48:15 | 显示全部楼层

回复 136# wayne 的帖子

谢谢夸奖

我只在前面加了个排序,按理说时间应该变长,结果却出乎意料的由0.109变为0.093
看来还和测试机器的缓存相关!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-3-18 11:55:32 | 显示全部楼层
呵呵,离0.062越来越近了!我觉得这样下去破纪录是早晚的事儿!

我感觉可以到0.04左右,可以试试我说的方法,应该是个n*logN的方法,虽然常数稍微有些大!

原帖由 shshsh_0510 于 2009-3-18 11:48 发表
谢谢夸奖

我只在前面加了个排序,按理说时间应该变长,结果却出乎意料的由0.109变为0.093
看来还和测试机器的缓存相关!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-18 12:04:36 | 显示全部楼层
呵呵,不玩了,把正事都耽误了,估计也许真的可以在当前测试系统中达到0.067
把代码贴上,谁有兴趣就试一下看。
总结一下:按73# 方法倒着比较,对随机数据在平均复杂性意义下,基本上就是最快的程序了。在该系统中,也能达到0.4
接下来,其实就不是看算法了,而在猜测试数据 其数据中,异或后小于 2^32的很多,
所以先判断一下前3个异或值是不是0立刻可以到达0.109
我还试着调节调用scanf的次数,但看起来没什么差别。对每个判断逻辑进行一些手工优化,但并不比编译器好。
一个令我出乎意料的是,在前面加了一个sort,居然变为0.093
拍完序当然还可以分治一下什么的,但归根结底还是猜测试数据的样子,有点像是黑客了
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>


  4. int compare( const void *arg1, const void *arg2 )
  5. {
  6.    //return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );
  7.     if(*((unsigned int *)arg1) !=*((unsigned int *)arg2))
  8.         return *(unsigned int *)arg1>* ( unsigned int *)arg2;
  9.     if(* (( unsigned int*)arg1+1)!=* (( unsigned int*)arg2+1))
  10.         return * (( unsigned int*)arg1+1)>* (( unsigned int*)arg2+1);
  11.     if(* (( unsigned int*)arg1+2)!=* (( unsigned int*)arg2+2))
  12.         return * (( unsigned int*)arg1+2)>* (( unsigned int*)arg2+2);
  13.     return * (( unsigned int*)arg1+3)>* (( unsigned int*)arg2+3);
  14. }


  15. int main(int argc, char* argv[])
  16. {
  17.     unsigned int * tmp3;
  18.     int count,result,i,j,tmp2,tmp;
  19.     unsigned int data[4*5000];
  20.     unsigned int d1,d2,d3,d4;
  21.     scanf("%d",&count);
  22.     result=0;
  23.     tmp=0;
  24.     tmp2=count*4;
  25.     while (tmp<tmp2) {
  26.         tmp3=data+tmp;
  27.         scanf("%u",data+tmp);
  28.         tmp++;
  29. //      scanf("%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u",
  30. //          tmp3,tmp3+1,tmp3+2,tmp3+3,tmp3+4,tmp3+5,tmp3+6,tmp3+7,tmp3+8,tmp3+9,tmp3+10,tmp3+11,tmp3+12,tmp3+13,tmp3+14,tmp3+15);
  31. //      tmp+=16;
  32.     }

  33.     qsort( (void *)data, (size_t)count, 16, compare );


  34.     /////////////////////////////////////////////////////
  35. //  if ( count &0x1) {
  36. //      for (i=0;i<(count-1)/2;i++)
  37. //      {
  38. //          tmp=i*8;
  39. //          scanf("%u %u %u %u %u %u %u %u",
  40. //              &(data[tmp]),&(data[tmp+1]),&(data[tmp+2]),&(data[tmp+3]),
  41. //              &(data[tmp+4]),&(data[tmp+5]),&(data[tmp+6]),&(data[tmp+7]));
  42. //      }
  43. //      scanf("%u %u %u %u",&(data[tmp+8]),&(data[tmp+9]),&(data[tmp+10]),&(data[tmp+11]));
  44. //  }else {
  45. //      for (i=0;i<count/2;i++)
  46. //      {
  47. //          tmp=i*8;
  48. //          scanf("%u %u %u %u %u %u %u %u",
  49. //              &(data[tmp]),&(data[tmp+1]),&(data[tmp+2]),&(data[tmp+3]),
  50. //              &(data[tmp+4]),&(data[tmp+5]),&(data[tmp+6]),&(data[tmp+7]));
  51. //      }
  52. //  }
  53.     ////////////////////////////////////////////////////
  54. //  for (i=0;i<count*4;i++)
  55. //  {
  56. //      scanf("%u",&(data[i]));
  57. //  }
  58.     ////////////////////////////////////////////////////
  59. //  for (i=0;i<count;i++)
  60. //  {
  61. //      tmp=i*4;
  62. //      scanf("%u %u %u %u",&(data[tmp]),&(data[tmp+1]),&(data[tmp+2]),&(data[tmp+3]));
  63. //  }

  64.     for (i=0;i<count;i++){
  65.         for (j=i+1;j<count;j++){
  66.             tmp=i*4;
  67.             tmp2=j*4;
  68.             d1=data[tmp]^data[tmp2];
  69.             d2=data[tmp+1]^data[tmp2+1];
  70.             d3=data[tmp+2]^data[tmp2+2];
  71.             d4=data[tmp+3]^data[tmp2+3];

  72.             if(d1==0 && d2==0 && d3==0) { goto C1;} //0.218


  73.             //(0,160047680,1518781562,1262177448)
  74. //          if (  (d1>1262177448) ||
  75. //              (d1==1262177448 && d2 >1518781562)  ||
  76. //              (d1==1262177448 && d2 ==1518781562 && d3 >160047680 ) ||
  77. //              (d1==1262177448 && d2 ==1518781562 && d3 ==160047680 ) )
  78.             if (  (d1>1262177448) || ( d1==1262177448 &&  (d2 >1518781562 || (d2 ==1518781562 && d3 >=160047680))))
  79.             {result+=38;continue;}
  80.             //(0,16004768,3587851993,126217744),
  81. //          if (  (d1>126217744) ||
  82. //              (d1==126217744 && d2 >3587851993)  ||
  83. //              (d1==126217744 && d2 ==3587851993 && d3 >16004768 ) ||
  84. //              (d1==126217744 && d2 ==3587851993 && d3 ==16004768 ) )
  85.             if (  (d1>126217744) || ( d1==126217744 &&  (d2 >3587851993 || (d2 ==3587851993 && d3 >=16004768))))
  86.             {result+=37;continue;}
  87.             //(0,3008077584,2076772117,12621774),
  88.             if (  (d1>12621774) ||
  89.                 (d1==12621774 && d2 >2076772117)  ||
  90.                 (d1==12621774 && d2 ==2076772117 && d3 >3008077584 ) ||
  91.                 (d1==12621774 && d2 ==2076772117 && d3 ==3008077584) )
  92.             {result+=36;continue;}
  93.             //(0,730304488,1925664130,1262177),
  94.             if (  (d1>1262177) ||
  95.                 (d1==1262177 && d2 >1925664130)  ||
  96.                 (d1==1262177 && d2 ==1925664130 && d3 >730304488 ) ||
  97.                 (d1==1262177 && d2 ==1925664130 && d3 ==730304488 ) )
  98.             {result+=35;continue;}
  99.             //(0,932023908,3199043520,126217),
  100.             if (  (d1>126217) ||
  101.                 (d1==126217 && d2 >3199043520)  ||
  102.                 (d1==126217 && d2 ==3199043520 && d3 >932023908 ) ||
  103.                 (d1==126217 && d2 ==3199043520 && d3 ==932023908 ) )
  104.             {result+=34;continue;}
  105.             //(0,952195850,3326381459,12621),
  106.             if (  (d1>12621) ||
  107.                 (d1==12621 && d2 >3326381459)  ||
  108.                 (d1==12621 && d2 ==3326381459 && d3 >952195850 ) ||
  109.                 (d1==12621 && d2 ==3326381459 && d3 ==952195850 ) )
  110.             {result+=33;continue;}
  111.             //(0,2242703233,762134875,1262),
  112.             if (  (d1>1262) ||
  113.                 (d1==1262 && d2 >762134875)  ||
  114.                 (d1==1262 && d2 ==762134875 && d3 >2242703233 ) ||
  115.                 (d1==1262 && d2 ==762134875 && d3 ==2242703233 ) )
  116.             {result+=32;continue;}
  117.             //(2147483648,3230747430,935206946,126),
  118.             if (  (d1>126) ||
  119.                 (d1==126 && d2 >935206946)  ||
  120.                 (d1==126 && d2 ==935206946 && d3 >3230747430 ) ||
  121.                 (d1==126 && d2 ==935206946 && d3 ==3230747430 && d4> 2147483647) )
  122.             {result+=31;continue;}
  123.             //(1073741824,1182068202,2670501072,12),
  124.             if (  (d1>12) ||
  125.                 (d1==12 && d2 >2670501072)  ||
  126.                 (d1==12 && d2 ==2670501072 && d3 >1182068202 ) ||
  127.                 (d1==12 && d2 ==2670501072 && d3 ==1182068202 && d4> 1073741823) )
  128.             {result+=30;continue;}
  129.             //(2684354560,1836193738,1126043566,1),
  130.             if (  (d1>1) ||
  131.                 (d1==1 && d2 >1126043566)  ||
  132.                 (d1==1 && d2 ==1126043566 && d3 >1836193738 ) ||
  133.                 (d1==1 && d2 ==1126043566 && d3 ==1836193738 && d4> 2684354559) )
  134.             {result+=29;continue;}
  135.             //(268435456,1042612833,542101086,0),

  136.             if (  (d1>0) ||
  137.                 (d1==0 && d2 >542101086)  ||
  138.                 (d1==0 && d2 ==542101086 && d3 >1042612833 ) ||
  139.                 (d1==0 && d2 ==542101086 && d3 ==1042612833 && d4> 268435455) )
  140.             {result+=28;continue;}
  141.             //(3892314112,2681241660,54210108,0),
  142.             if ((d2 >54210108)  ||
  143.                 (d2 ==54210108 && d3 >2681241660 ) ||
  144.                 (d2 ==54210108 && d3 ==2681241660 && d4> 3892314111) )
  145.             {result+=27;continue;}
  146.             //(3825205248,3704098002,5421010,0),
  147.             if ((d2 >5421010)  ||
  148.                 (d2 ==5421010 && d3 >3704098002 ) ||
  149.                 (d2 ==5421010 && d3 ==3704098002 && d4> 3825205247) )
  150.             {result+=26;continue;}

  151.             //          ,(1241513984,370409800,542101,0)
  152.             if ((d2 >542101)  ||
  153.                 (d2 ==542101 && d3 >370409800 ) ||
  154.                 (d2 ==542101 && d3 ==370409800 && d4> 1241513983) )
  155.             {result+=25;continue;}
  156.             //          ,(2701131776,466537709,54210,0)
  157.             if ((d2 >54210)  ||
  158.                 (d2 ==54210 && d3 >466537709 ) ||
  159.                 (d2 ==54210 && d3 ==466537709 && d4> 2701131775) )
  160.             {result+=24;continue;}

  161.             //          ,(4135583744,46653770,5421,0)
  162.             if ((d2 >5421)  ||
  163.                 (d2 ==5421 && d3 >46653770 ) ||
  164.                 (d2 ==5421 && d3 ==46653770 && d4> 4135583743) )
  165.             {result+=23;continue;}
  166.             //          ,(2990538752,434162106,542,0)
  167.             if ((d2 >542)  ||
  168.                 (d2 ==542 && d3 >434162106 ) ||
  169.                 (d2 ==542 && d3 ==434162106 && d4> 2990538751) )
  170.             {result+=22;continue;}
  171.             //          ,(3735027712,902409669,54,0)
  172.             if ((d2 >54)  ||
  173.                 (d2 ==54 && d3 >902409669 ) ||
  174.                 (d2 ==54 && d3 ==902409669 && d4> 3735027711) )
  175.             {result+=21;continue;}
  176.             //          ,(1661992960,1808227885,5,0)
  177.             if ((d2 >5)  ||
  178.                 (d2 ==5 && d3 >1808227885 ) ||
  179.                 (d2 ==5 && d3 ==1808227885 && d4> 1661992959) )
  180.             {result+=20;continue;}
  181.             //          ,(2313682944,2328306436,0,0)
  182.             if ((d2 >0)  ||
  183.                 (d2 ==0 && d3 >2328306436 ) ||
  184.                 (d2 ==0 && d3 ==2328306436 && d4> 2328306435) )
  185.             {result+=19;continue;}

  186.             //          ,(2808348672,232830643,0,0)
  187.             if ((d3 >232830643 ) ||
  188.                 (d3 ==232830643 && d4> 2808348671) )
  189.             {result+=18;continue;}

  190.             //          ,(1569325056,23283064,0,0)
  191.             if ((d3 >23283064 ) ||
  192.                 (d3 ==23283064 && d4> 1569325055) )
  193.             {result+=17;continue;}
  194.             //          ,(1874919424,2328306,0,0)
  195.             if ((d3 >2328306 ) ||
  196.                 (d3 ==2328306 && d4> 1874919423) )
  197.             {result+=16;continue;}
  198.             //          ,(2764472320,232830,0,0)
  199.             if ((d3 >232830 ) ||
  200.                 (d3 ==232830 && d4> 2764472319) )
  201.             {result+=15;continue;}
  202.             //          ,(276447232,23283,0,0)
  203.             if ((d3 >23283 ) ||
  204.                 (d3 ==23283 && d4> 276447231) )
  205.             {result+=14;continue;}
  206.             //          ,(1316134912,2328,0,0)
  207.             if ((d3 >2328 ) ||
  208.                 (d3 ==2328 && d4> 1316134911) )
  209.             {result+=13;continue;}
  210.             //          ,(3567587328,232,0,0)
  211.             if ((d3 >232 ) ||
  212.                 (d3 ==232 && d4> 3567587327) )
  213.             {result+=12;continue;}
  214.             //          ,(1215752192,23,0,0)
  215.             if ((d3 >23 ) ||
  216.                 (d3 ==23 && d4> 1215752191) )
  217.             {result+=11;continue;}
  218.             //          ,(1410065408,2,0,0)
  219.             if ((d3 >2 ) ||
  220.                 (d3 ==2 && d4> 1410065407) )
  221.             {result+=10;continue;}
  222.             //(1000000000,0,0,0),
  223. C1:

  224.             if ((d3 >0 ) ||
  225.                 (d3 ==0 && d4> 999999999) )
  226.             {result+=9;continue;}


  227.             //(100000000,0,0,0),
  228.             if (d4> 99999999)  {result+=8;continue;}
  229.             if (d4> 9999999)  {result+=7;continue;}
  230.             if (d4> 999999)  {result+=6;continue;}
  231.             if (d4> 99999)  {result+=5;continue;}
  232.             if (d4> 9999)  {result+=4;continue;}
  233.             if (d4> 999)  {result+=3;continue;}
  234.             if (d4> 99)  {result+=2;continue;}
  235.             if (d4> 9) {result+=1;continue;}

  236.         }

  237.     }
  238.     printf("%u",result*2);
  239.     return 0;
  240. }
复制代码

评分

参与人数 1威望 +1 鲜花 +1 收起 理由
litaoye + 1 + 1 精彩绝伦

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-5 06:27 , Processed in 0.121182 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表