hdu 4710 Balls Rearrangement (数学思维)

题意:就是  把编号从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<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>

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

hdu 4710 Balls Rearrangement (数学思维),布布扣,bubuko.com

时间: 2024-10-07 19:50:31

hdu 4710 Balls Rearrangement (数学思维)的相关文章

hdu 4611 Balls Rearrangement 数学

Balls Rearrangement Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Problem Description Bob has N balls and A boxes. He numbers the balls from 0 to N-1, and numbers the boxes from 0 to A-1. To find the balls easily

【瞎搞】 HDU 4710 Balls Rearrangement

题目地址:点击打开链接 题意:有N 个小球,编号 0--N-1 两个序列      第 i 个 球 Xi = (i mod A ) 第i个 Yi=(i mod B ) 求   sigma(|Xi-Yi |) 可以知道总有一段 Xi 与Yi 的差是相等的 模拟下可以加快速度. #include <cstdio> #include <cstring> #include <cstdlib> #include <string> #include <iostre

hduoj 4710 Balls Rearrangement 2013 ACM/ICPC Asia Regional Online —— Warmup

http://acm.hdu.edu.cn/showproblem.php?pid=4710 Balls Rearrangement Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 735    Accepted Submission(s): 305 Problem Description Bob has N balls and A b

HDU 5570 balls 期望 数学

balls Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5570 Description There are n balls with m colors. The possibility of that the color of the i-th ball is color j is ai,jai,1+ai,2+...+ai,m. If the number of b

HDU 4816 Bathysphere(数学)(2013 Asia Regional Changchun)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 Problem Description The Bathysphere is a spherical deep-sea submersible which was unpowered and lowered into the ocean on a cable, and was used to conduct a series of dives under the sea. The Bathys

程序设计中的数学思维函数总结(代码以C#为例)

最近以C#为例,学习了程序设计基础,其中涉及到一些数学思维,我们可以巧妙的将这些逻辑问题转换为代码,交给计算机运算. 现将经常会使用到的基础函数做一总结,供大家分享.自己备用. 1.判断一个数是否为奇数 定义:整数中,能被2整除的数是偶数,不能被2整除的数是奇数 思路点:n%2!=0则为奇数 /// <summary> /// 判断一个整数是不是奇数 /// </summary> /// <param name="n">要判断的整数</para

HDU 6154 CaoHaha&#39;s staff 思维 找规律

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6154 题目描述: 围成一个面积不小于S的多边形, 最少需要多少根儿线段, 线段可以为单元格边或者对角线 解题思路: 最大的面积肯定是由根号2为边长的正方形围成了, 那么我们把所有正方形都遍历一遍, 找出S介于N, N+1的那个上界N+1设为max, 因为MAX所围成的多边形面积和MAX-1, MAX-2, MAX-3围成的多边形面积, 找出满足条件的最小的一个即可 代码: #include <io

2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6154 CaoHaha&#39;s staff 思维

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6154 题意:在笛卡尔坐标系下,画一个面积至少为  n 的简单多边形,每次只能画一条边或者一个格子的对角线,问至少要画几条. 解法:如果一个斜着的矩形长宽分别是 a,b,那么它的面积是 2ab.最优解肯定是离 sqrt(n/2)很近的位置.想想 n=5 时答案为什么是7 然后在那个小范围内枚举一下就好了.我给一张做题时画的图 #include <bits/stdc++.h> using namesp

HDU 4937 Lucky Number (数学,进制转换)

题目 参考自博客:http://blog.csdn.net/a601025382s/article/details/38517783 //string &replace(iterator first0, iterator last0,const_iterator first, const_iterator last); //把[first0,last0)之间的部分替换成[first,last)之间的字符串 /* 题意: 我们将3,4,5,6认为是幸运数字.给定一个十进制数n. 现在可以讲起任意转