找回密码
 欢迎注册
楼主: 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-11-18 15:38 , Processed in 0.024352 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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