【中山市选2013】球

37 篇文章 0 订阅
10 篇文章 0 订阅

Description

小包有N个球和A个盒子。球标号为0到N-1,盒子编号为0到A-1。标号为x的球放在下标为x mod A的盒子里。

然后他得到了B个新盒子,编号为0到B-1。他想把所有球从旧盒子里面拿出来放到新盒子,标号为x的球放在下标为x mod B的盒子里。

对于某个球来说,如果原本放在下标为a的旧盒子,现在放在下表为b的新盒子,那么费用为|a-b|。

求出总花费。

Input

输入3个整数N,A和B,同一行。

Output

输出总花费。

Sample Input

输入1:

1000000000 1 1

输入2:

8 2 4

Sample Output

输出1:

0

输出2:

8

Data Constraint

对于30%的数据有1≤N≤20

对于全部数据,有1≤N≤1000000000,A,B≤100000

思路:

这道题有点坑。。。
一开始我就想着处理一个表,大概可以水点分,结果发现MLE,RE,WA。。。

于是我便认真地推起了规律。。。

我们发现,在非倍数交替之间,那一个区间的代价是一样的,于是就可以跳着加,加了这个优化就可以AC啦!!!

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long n,a,b,i=0,x,j=0,k=0,ass=0;
int main()
{

    scanf("%lld%lld%lld",&n,&a,&b);
    while (1)
    {

        x=min(a-j,b-k);
        if (i+x>n)
        {

            ass+=(n-i)*abs(j-k);
            printf("%lld",ass);
            return 0;

        }
        ass+=x*abs(j-k);
        i+=x;j+=x;k+=x;
        if (j==a) j=0;
        if (k==b) k=0;

    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值