博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 4710 Balls Rearrangement (数学思维)
阅读量:6572 次
发布时间:2019-06-24

本文共 1127 字,大约阅读时间需要 3 分钟。

意甲冠军:那是,  从数0-n小球进入相应的i%a箱号。然后买一个新的盒子。

            今天的总合伙人b一个盒子,Bob试图把球i%b箱号。

求复位的最小成本。

            每次移动的花费为y - x ,即移动前后盒子编号的差值的绝对值。

算法:

题目就是要求                           

先推断  n与  lcm(a,b)的大小,每个周期存在循环。这样把区间缩短避免反复计算。

假设n>lcm(a,b)则   ans = (n/lcm)*solve(lcm)+solve(n%lcm)

否则   ans = solve(n)

设x和y各自等于  i%a和i%b。

我们通过枚举 找规律能发现  t=min(a-x,b-y)是一个段,这一段内abs(x-y)是相等的。

所以仅仅须要用abs(x-y)乘以次数t,在算下一段即可了。

这里要注意t<n-now的情况。本来这一段应该有t个,可是now+t>n了。所以要取t = min(t,n-now)

#include
#include
#include
#include
using namespace std;typedef __int64 ll;ll a,b;ll Gcd(ll x,ll y){ return y==0?x:Gcd(y,x%y);}ll abs(ll x){ return x>=0?

x:(-x); } ll solve(ll n) { ll x=0,y=0,t,v1,v2,now=0; ll ret = 0; while(now<n) { v1 = a-x; v2 = b-y; t = min(v1,v2); t = min(t,n-now); ret += t*abs(x-y); x = (x+t)%a; y = (y+t)%b; now += t; } return ret; } int main() { int T; ll n,gcd,lcm,ans; scanf("%d",&T); while(T--) { scanf("%I64d%I64d%I64d",&n,&a,&b); gcd = Gcd(a,b); lcm = a*b/gcd; if(n>=lcm) ans = solve(lcm)*(n/lcm) + solve(n%lcm); else ans = solve(n); printf("%I64d\n",ans); } return 0; }

魔芋真的不适合  搞数学  o(╯□╰)o

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
【转】在Ubuntu上下载、编译和安装Android最新源代码
查看>>
Dubbo入门实例--转载
查看>>
设计模式C++学习笔记之三(Singleton单例模式)
查看>>
【Oracle学习笔记-4】内连接和外连接的区别
查看>>
CSS初始化示例代码
查看>>
管道的故事(转)
查看>>
基于jquery响应式网站图片无限加载瀑布流布局
查看>>
关于开源的金玉良言
查看>>
Library Cache: Lock, Pin and Load Lock
查看>>
python查询mysql中文乱码问题
查看>>
JellyViewPager
查看>>
Linux守护进程的编程实现
查看>>
深入PHP内核之ZVAL
查看>>
T3 - 构建大型 Web 应用的 JavaScript 框架
查看>>
【书评:Oracle查询优化改写】第三章
查看>>
错误代码:ERR_UNSAFE_PORT
查看>>
Android中Parcelable与Serializable接口用法
查看>>
【angularjs】【学习心得】路由继续研究篇
查看>>
装饰模式
查看>>
LESS CSS 框架简介(转)
查看>>