找回密码
 欢迎注册
查看: 297|回复: 6

[讨论] 爬山问题

[复制链接]
发表于 2025-3-10 18:33:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
爬山问题
爬山.png
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2025-3-10 19:45:52 | 显示全部楼层
第n个山峰的坐标很好求,问题是什么情况下看不到呢?直觉需要斜率的动态比较 peak.jpg

点评

就是,从第k个山顶与前面所有k-1个连线作比较。  发表于 2025-3-10 20:17
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2025-3-11 08:26:02 | 显示全部楼层
山峰的高度和山谷的深度形成的数列是这个:

https://oeis.org/A008347

山峰好像是上凸的,能看到的基本上都是近处的山峰,远处的山峰好像基本上都看不到
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2025-3-11 09:08:47 | 显示全部楼层
从复杂度来说,对于现在的计算机,$10^5$不大,直接计算每个点同后面所有点的仰角并进行比较是否超过当前已知最大仰角即可。
当然从效率上,应该需要考虑Fans提到的基本上都是近峰的问题,所以可以缩小计算数目。如果当前仰角正切值已经大于后面最大素数gap/两素数和,那么就不需要继续搜索了,不知道这个裁剪效率如何
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2025-3-11 11:32:18 | 显示全部楼层
本帖最后由 iseemu2009 于 2025-3-11 11:34 编辑

下面的程序计算前15个山峰的坐标
  1. zb[n_] := {Total[Prime[Range[2 n - 1]]],
  2.                    Total[Table[(-1)^(i - 1) Prime[i], {i, 2 n - 1}]]};(*计算第n个峰顶的坐标*)
  3.                    dianji = Table[zb[i], {i, 15}]  (*计算前15个峰顶(点集)的坐标*)
复制代码

  1. {2, 2}, {10, 4}, {28, 8}, {58, 12}, {100, 16}, {160, 18}, {238, 22}, {328, 26}, {440, 32}, {568, 38}, {712, 40}, {874, 44}, {1060, 52}, {1264, 54}, {1480, 56}
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2025-3-11 14:26:33 | 显示全部楼层
52462
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define MAXP 2750200L
  4. #ifndef MPS
  5. #define MPS 20000
  6. #endif
  7. unsigned char notp[MAXP];
  8. int pc;
  9. long plist[MPS];
  10. long sumf[MPS/2];
  11. long sumg[MPS/2];
  12. int maxslop[MPS/2];

  13. #define ISPRIME(x) (!notp[x])
  14. #define UNSETPRIME(x) (notp[x]=1)

  15. void initp()
  16. {
  17.   UNSETPRIME(0);
  18.   UNSETPRIME(1);
  19.   long i;
  20.   plist[pc++]=0;//add an extra number 0 at the beginning
  21.   for(i=2;i<MAXP;i++){
  22.     if(ISPRIME(i)){
  23.       long j;
  24.       plist[pc++]=i;
  25.       if(pc>=MPS)break;
  26.       for(j=i*i;j<MAXP;j+=i)UNSETPRIME(j);
  27.     }
  28.   }
  29.   if(pc<MPS){
  30.     fprintf(stderr,"Prime not enough\n");
  31.     exit(-1);
  32.   }
  33.   sumf[MPS/2-1]=plist[MPS-1]+plist[MPS-2];
  34.   sumg[MPS/2-1]=plist[MPS-1]-plist[MPS-2];
  35.   maxslop[MPS/2-1]=MPS/2-1;
  36.   for(i=MPS/2-2;i>=0;i--){
  37.     sumf[i]=plist[2*i]+plist[2*i+1];
  38.     sumg[i]=plist[2*i+1]-plist[2*i];
  39.     if(sumg[i]*sumf[maxslop[i+1]]>sumg[maxslop[i+1]]*sumf[i]){
  40.       maxslop[i]=i;
  41.     }else{
  42.       maxslop[i]=maxslop[i+1];
  43.     }
  44.   }
  45. }

  46. int main()
  47. {
  48.   int i,j;
  49.   long tsum=0;
  50.   long bx=0,by=0;
  51.   initp();
  52.   for(i=0;i<MPS/2-1;i++){
  53.     long fx=sumf[i+1];
  54.     long fy=sumg[i+1];
  55.     bx=fx;by=fy;
  56.     long cc=1;
  57.     for(j=i+2;j<MPS/2;j++){
  58.       if(by*sumf[maxslop[j]]>=bx*sumg[maxslop[j]])break;
  59.       fx+=sumf[j];
  60.       fy+=sumg[j];
  61.       if(fx*by<bx*fy){//higher than best
  62.           cc++;
  63.           by=fy;bx=fx;
  64.       }
  65.     }
  66.     tsum+=cc;
  67.   }
  68.   printf("%ld\n",tsum);
  69.   return 0;
  70. }
复制代码

评分

参与人数 1威望 +8 金币 +8 贡献 +8 经验 +8 鲜花 +8 收起 理由
northwolves + 8 + 8 + 8 + 8 + 8 赞一个!

查看全部评分

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

本版积分规则

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

GMT+8, 2025-3-22 16:36 , Processed in 0.052425 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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