当前位置: 首页 > news >正文

【洛谷P1080国王游戏】2025-3-7

缘由洛谷P1080 国王游戏 wa一个点_编程语言-CSDN问答

用数据分析推导:左手按升序右手按升序计算即可,由于涉及大数乘法和除法,研究如何变换算法就显得有点意思了,可以把大整数转为整数范围内运算,玩推导就是个乐子,确实是个乐子。
积商不变性质,如:7*5*2/4=3*5*2/4+1*5*2=3*1*2/4+1*5*2+1*2*3=2/4+1*5*2+1*2*3+1=17.5,
7*4*2/7=0*4*2/7+1*2*4=8=1*4*2/1,4*2/4=0*2/4+1*2=2=1*2/1,
7*4*2/4=7*0*2/4+1*7*2=14=3*4*2/4+1*4*2=3*0*2/4+1*4*2+1*2*3=14。
如果看得懂的话,使用以上推导去做,可减小乘积的量,同时使用LONG LONG数据类型的话,对100的数据应该足够使用,免去编写大数运算,其实,已经解题了,且程序也变得更容易实现。

void 洛谷P1080国王游戏()
{int a[1080][3]{}, n = 0, j = 0, x = 0;bool k = 1; long long m = 0;std::cin >> n >> a[0][0] >> a[0][1];
sr:if (x++ < n)
{//3 1 1 2 3 7 4 4 6//4 1 1 2 3 7 4 4 6 7 7std::cin >> a[x][0] >> a[x][1];goto sr;
}
px:if (j < n)
{//左手右手升序if (--x > j){if (a[x][0] < a[x - 1][0])两数交换(a[x][0], a[x - 1][0]), 两数交换(a[x][1], a[x - 1][1]), k = 0;if (a[x][0] == a[x - 1][0] && a[x][1] < a[x - 1][1])两数交换(a[x][0], a[x - 1][0]), 两数交换(a[x][1], a[x - 1][1]), k = 0;if (x < n){if (a[n - x][0] > a[n - x + 1][0])两数交换(a[n - x][0], a[n - x + 1][0]), 两数交换(a[n - x][1], a[n - x + 1][1]), k = 0;if (a[n - x][0] == a[n - x + 1][0] && a[n - x][1] > a[n - x + 1][1])两数交换(a[n - x][0], a[n - x + 1][0]), 两数交换(a[n - x][1], a[n - x + 1][1]), k = 0;}}if (x == j){x = n - j;if (k)j = n;else ++j, k = 1;}goto px;
}
js:if (n)
{if (a[--j][0] >= a[n][1]){a[j][2] = a[j][0] / a[n][1], a[j][0] %= a[n][1];x = n;qs:if (x--){ if (x != j)a[j][2] *= a[x][0]; goto qs; }}else if (a[j][0] < a[n][1]){if (j){x = n;qj:if (--x){ a[j - 1][0] *= a[x][0], a[x][0] = 1; goto qj; }}else goto sc;}if (a[j][0] == 0){sc:if (x++ < n){ m += a[x][2]; goto sc; }std::cout << m << "\n"; n = 0;}goto js;
}
}px:if (j < n)
{//左手升序,右手降序if (--x > j){if (a[x][0] < a[x - 1][0])两数交换(a[x][0], a[x - 1][0]), 两数交换(a[x][1], a[x - 1][1]), k = 0;if (a[x][0] == a[x - 1][0] && a[x][1] > a[x - 1][1])两数交换(a[x][0], a[x - 1][0]), 两数交换(a[x][1], a[x - 1][1]), k = 0;if (x < n){if (a[n - x][0] > a[n - x + 1][0])两数交换(a[n - x][0], a[n - x + 1][0]), 两数交换(a[n - x][1], a[n - x + 1][1]), k = 0;if (a[n - x][0] == a[n - x + 1][0] && a[n - x][1] < a[n - x + 1][1])两数交换(a[n - x][0], a[n - x + 1][0]), 两数交换(a[n - x][1], a[n - x + 1][1]), k = 0;}}if (x == j){x = n - j;if (k)j = n;else ++j, k = 1;}goto px;
}

 
可见对二维数组不同升降排序非常简便实现。

商不变性质:积是除数的倍数,a*b/c=c*n/c=n;如果a*b是c的倍数则商是倍数;如:7*4/4=7。
积商不变性质,变为加法运算:7/4=4/4+3/4=1+0.75,2*7/4=2*3/4+1*2=2/4+3=3.5,
2*5*7/4=2*7*(4/4+1/4)/4=1*2*7+2*7*1/4=14+2*(4/4+3/4)=14+2+2*3/4=16+2/4+1=17.5,
(2*5)*7/4=2*7+2*7/4=14+3+2/4=17.5,1*2*7+1*2*7/4=14+3+2/4=17.5,2*1*3/4+(1*2*7+1*2)=16+6/4=16+1+2/4=17.5,3*5*2/4+1*5*2=3*1*2/4+1*5*2+1*2*3=2/4+1*5*2+1*2*3+1=17.5。

不要说AI了,来个人证明我分析的分式乘法转加法运算是错的,有?这种推导不是书本上有的。
其实这道题目可以优化或可不用数组,结合我分析的转换,完全可以抛开大数运算,用数据范围内运算即可,如INT范围,只要把积控制在数据范围内最大不超时就转换。如:4*5*6/7=120/7=17+1/7由于题目取整,最后不能化整的分式不用运算,待空闲写下优化算法代码。


http://www.mrgr.cn/news/93730.html

相关文章:

  • Java 大视界 -- 基于 Java 的大数据实时数据处理框架性能评测与选型建议(121)
  • 1.12.信息系统的分类【ES】
  • langchain系列(九)- LangGraph 子图详解
  • Django小白级开发入门
  • FPGA学习篇——Verilog学习5(reg,wire区分及模块例化)
  • 大数据_数仓建模_八股
  • 考研机试常见基本题型
  • 蓝桥杯嵌入式组第七届省赛题目解析+STM32G431RBT6实现源码
  • C#模拟鼠标点击,模拟鼠标双击,模拟鼠标恒定速度移动,可以看到轨迹
  • 数据结构第五节:二叉搜索树(BST)的基本操作与实现
  • RuoYi框架添加自己的模块(学生管理系统CRUD)
  • [Linux]进程
  • 在IDEA中进行git回滚操作:Reset current branch to here‌或Reset HEAD
  • 代码随想录算法营Day59,61 | 寻找存在的路径, 冗余连接,冗余连接II
  • SpringBoot集成MQ,四种交换机的实例
  • Vue3实战学习(Vue3的基础语法学习与使用(超详细))(3)
  • docker 常用命令教程
  • Ubuntu 下 nginx-1.24.0 源码分析 (1)
  • 【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 过滤器:实现请求的预处理与后处理
  • VBA 列方向合并单元格,左侧范围大于右侧范围