Balls Rearrangement

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1661    Accepted Submission(s): 627

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, he puts the ball numbered x into the box numbered a if x = a mod A.   Some day Bob buys B new boxes, and he wants to rearrange the balls from the old boxes to the new boxes. The new boxes are numbered from 0 to B-1. After the rearrangement, the ball numbered x should be in the box number b if x = b mod B.

This work may be very boring, so he wants to know the cost before the rearrangement. If he moves a ball from the old box numbered a to the new box numbered b, the cost he considered would be |a-b|. The total cost is the sum of the cost to move every ball, and it is what Bob is interested in now.
 
Input
The first line of the input is an integer T, the number of test cases.(0<T<=50) 

Then T test case followed. The only line of each test case are three integers N, A and B.(1<=N<=1000000000, 1<=A,B<=100000).
 
Output
For each test case, output the total cost.
 
Sample Input
3
1000000000 1 1
8 2 4
11 5 3
 
Sample Output
0
8
16
 
Source
 

             
  题目大意:刚开始比赛的时候,一看见这题,以为是水题。是自己想简单了。题目是这样:给你n个球编号0~n-1,先放进a个箱子里,i mod a =p,第i个球放在箱子p里面,就是同模的放在一起。然后再把这些球移到b个箱子里面,同样的法则。sum值等于每个球从i号箱子移到j号箱子的数目总和。一个球的sum=abs(i-j).

          解题思路:开始把他想简单了,这些球都是有唯一的标识的。后来想清楚了之后,发现循环节是mi(n,lcm(a,b))但是直接用循环节统计会TLE。如果a取9999,b取9997,n=10^9那么循环节直接是10^9。肯定会TLE。然后又开始找规律,突然发现可以用两个指针不断地移动。不用每次都是++,自己可以在纸上画一下。
0 1 2 3 4     0 1 2
5 6 7 8 9 3 4 5
10 6 7 8
9 10

如果到6的时候,左边一行可以到9,右边一行可以到8.我们选取小的。会发现6~8之间abs(i-j)是一样的。同理0可以直接跳到3那里。主要就是用到这个思想。详见代码。当时因为没有用__int64Wa了好半天!!!

          题目地址:Balls Rearrangement

AC代码:
0 1 2 3 4     0 1 2
5 6 7 8 9 3 4 5
10 6 7 8
9 10 #include<iostream>
#include<cstdio>
using namespace std; __int64 f(__int64 x)
{
if(x<0)
x=-x;
return x;
}
__int64 gcd(__int64 m,__int64 n)
{
__int64 t;
while(n)
{
t=m%n; m=n; n=t;
}
return m;
} __int64 min1(__int64 x1,__int64 x2)
{
if(x1<x2) return x1;
else return x2;
} int main()
{
__int64 mi,p,a,b,i,j,t1,t2,cnt,sum,tes;
__int64 lcm;
scanf("%I64d",&tes);
while(tes--)
{
scanf("%I64d%I64d%I64d",&p,&a,&b);
if(a==b)
{
puts("0");
continue;
}
lcm=a/gcd(a,b)*b; //a,b的最小公倍数
mi=p;
if(mi>lcm)
mi=lcm; //mi是循环节
t1=p/mi,t2=p%mi;
cnt=0,i=0,j=0;
sum=0; __int64 mi2;
while(cnt<mi) //一个循环内的
{
if(i>=a) i-=a;
if(j>=b) j-=b;
mi2=min1(a-i,b-j);
if(mi2>mi-cnt) //这点需要注意,不能超过步数
mi2=mi-cnt;
sum+=f(i-j)*mi2;
i+=mi2; j+=mi2; cnt+=mi2;
}
sum=sum*t1;
cnt=0,i=0,j=0;
while(cnt<t2) //循环节以外的
{
if(i>=a) i-=a;
if(j>=b) j-=b;
mi2=min1(a-i,b-j);
if(mi2>t2-cnt)
mi2=t2-cnt;
sum+=f(i-j)*mi2;
i+=mi2; j+=mi2; cnt+=mi2;
}
printf("%I64d\n",sum);
}
return 0;
} /*
23
1000000000 1 1
8 2 4
11 5 3
1000000000 9999 9997
*/

HDU 4611Balls Rearrangement(思维)的更多相关文章

  1. HDU 5776 sum (思维题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5776 题目让你求是否有区间的和是m的倍数. 预处理前缀和,一旦有两个数模m的值相同,说明中间一部分连续 ...

  2. hdu 4803 贪心/思维题

    http://acm.hdu.edu.cn/showproblem.php?pid=4803 话说C++还卡精度么?  G++  AC  C++ WA 我自己的贪心策略错了 -- 就是尽量下键,然后上 ...

  3. Binary Tree HDU - 5573 (思维)

    题目链接: B - Binary Tree  HDU - 5573 题目大意: 给定一颗二叉树,根结点权值为1,左孩子权值是父节点的两倍,右孩子是两倍+1: 给定 n 和 k,让你找一条从根结点走到第 ...

  4. HDU 5178 pairs —— 思维 + 二分

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5178 pairs Time Limit: 2000/1000 MS (Java/Others)     ...

  5. ACM-ICPC 2016 大连赛区现场赛 K. Guess the number && HDU 5981(思维+DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5981 题意:A在[L, R]之间随机选取一个数X,之后B来猜这个数,如果猜的数比X小,那么A就告诉B猜 ...

  6. ACM-ICPC 2017 沈阳赛区现场赛 M. Wandering Robots && HDU 6229(思维+期望)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6229 参考题解:https://blog.csdn.net/lifelikes/article/det ...

  7. CCPC 2017 哈尔滨 D. X-Men && HDU 6233(思维+期望)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6233 题意:一个树上有m个人,每个人在某个节点上,每个时刻每个人可以和一个与他距离大于 1 的点进行交 ...

  8. Cube HDU - 1220(思维)

    Cowl is good at solving math problems. One day a friend asked him such a question: You are given a c ...

  9. HDU - 4811 - Ball (思维)

    题意: 给出一定数量的三种颜色的球,计算如何摆放得到值最大(有一定顺序) 有三种摆放方法 1.如果放的是第一个(桌子上原来没有),数值不变 2.如果在末尾追加一个,那么增加前面不同颜色的个数的值 3. ...

随机推荐

  1. 【转】关于Adapter的The content of the adapter has changed问题分析 关于Adapter的The content of the adapter has changed问题分析

    原文网址:http://www.cnblogs.com/monodin/p/3874147.html 1.问题描述 1 07-28 17:22:02.162: E/AndroidRuntime(167 ...

  2. 黑马程序员_Java_多线程

    8.多线程 8.1.多线程概述 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程(例:FlashGet):就是进程中一个独立的控制单元.线 ...

  3. java.lang.NoClassDefFoundError 异常

    在项目实施过程中,当访问某一个功能时,出现异常为  java.lang.NoClassDefFoundError  com/xxx/yyy/Zzzz > ,检查发现这个类实际已经存在于应用服务器 ...

  4. Eclipse+Java+OpenCV246人脸识别

    1.环境搭建:见上一篇博客 整个项目的结构图: 2.编写DetectFaceDemo.java,代码如下: package com.njupt.zhb.test; import org.opencv. ...

  5. 【计算机视觉】基于行为的ReID演示

    帮老师做了一个简单的基于行为(主要是步态)的ReID问题的Demo,效果例如以下图: 以下是提取的集中特征,前三个都是GEI系的,后几个是基于光流场的.然后右边是识别出的几个对象的排序,由于没有角度和 ...

  6. ARM指令集——数据处理指令

    ARM汇编指令集 ARM汇编文件的组成 指令:编译完成后作为一条指令(机器码)存储在内存单元中,CPU执行时能够完成处理的操作 伪指令:在编译时替换成能被识别的ARM指令 伪操作:知道编译器进行编译, ...

  7. Java清洁:终结处理和垃圾回收

    一般情况:Java有垃圾回收机制负责回收无用对象占据的内存资源. 特殊情况:假定你的对象(并非使用new)获得一块特殊的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道如何释放 ...

  8. C#基础:关键字和数据类型

    [关键字]  #region 和 #endregion 关键字可以折叠代码  checked 用于整型算术运算时控制当前环境中的溢出检查  unchecked 操作符用于整型算术运算时控制当前环境中的 ...

  9. easyui combobox赋值

    $('#cc').combobox('setValue','bitem3').combobox('setText','bitem3')

  10. 点击推送消息跳转处理(iOS)

    当用户点击收到的推送消息时候,我希望打开APP,并且跳转到对应的界面,这就需要在AppDelegate里面对代理方法进行处理. 当用户点击推送消息打开APP的时候会调用 - (BOOL)applica ...