UVALive 7464 Robots(模拟)
7464Robots
Write a program to collect data from robots. We are given two sets of robotsX=fX1;:::;Xmg,Y=fY1;:::;Yng, and a baseB. Each robot has a data and we would like to compute the sum of datafrom all robots and deliver it to the base. In order to do so a robot can send its data to another robotor the base with the following constraints.
•A robot can only send its data to one destination (a robot or the base) at a time.
•A robot (or the base) can receive data from one robot at a time.
•The base can not send data to anyone.
•A robot inXcan complete sending its data in x seconds.A robot in Y can complete sending its data in y seconds.
The robots and the base can perform addition, so we can collect the final sum at the base. Thatis, we assume that after receiving a data, a robot or the base can perform an addition with zero time.Now let us illustrate this concept by an example. Let us consider a system with one robotX1inXand two robotsY1andY2inY. We also assume thatxis 1 andyis 10. At the beginningY1can sendits data toY2andX1can send its data to the base. After 1 second the base will know the data ofX1.However, only after 10 secondsY2will have the data ofY1, add its own data, and send the sum to thebase. After 20 seconds the base receives the sum of data fromY1andY2, adds the data fromX1, andhas the final sum. The entire summation will take 20 seconds.Now let us try a different schedule. At beginningY1sends data to the base, andY2sends data toX1, and both can complete after 10 seconds. Finally X1 starts sending the sum of data from Y2 anditself to the base after 10 seconds, and the entire summation can finish in 11 seconds.Now givenm,n(the numbers of robots in X and Y),x, andy, please determine the minimumnumber of seconds to finish the summation.Constraints•1x<y1000.•0m<1200.•0n<500.
Input
The input consists of multiple test cases. First line contains a single integertindicating the number oftest cases to follow. Each of the nexttlines contains four integers —x,y,m,n.
Output
For each test case, output on a single line the minimum number of seconds to sum up all numbers fromall robots.
Sample Input
11 10 1 2
Sample Output
11
题目意思:有x,y两种类型的机器人各n个和m个,还有一个基地B,x型的机器人将其货物运到基地或其他机器人上需要x秒,y型的机器人将其货物运到基地或其他机器人上需要y秒,同一时刻每个机器人只能发送给一个对象,也只能接受一个对象的货物,基地在同一时刻也只能接受一个机器人的货物,问你如何搭配才能花费最短的时间将所有的货物运送到基地。
解题思路:这道题当时做的时候理解错意思了,但稀里糊涂地AC了,昨天整理博客的时候发现这个题跟我最初理解的意思完全不一样,看了看同学的代码,发现同一组样例结果不同却都能过,我想这道题判题的时候的样例怕是非常水。。。。这道题还是选择模拟整个运送过程比较好。因为y类机器人的传输时间肯定大于x类机器人的传输时间,因此我们先处理y类机器人!当y类机器人的数量还有剩余时,我们先拿出一个来给Base,剩下的如果m >= n 则先挑出n 个 给x类机器人,剩下m-n进行合并!直到y类处理完为止!然后同样的方法处理x类机器人,直到x类没有为止!
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main() { int x,y,m,n; int T; scanf("%d",&T); while(T--) { scanf("%d %d %d %d",&x,&y,&n,&m); int ans=0; while(m) { m--;///y先送一个给base ans+=y; if (m>=n)///如果y的数量大于x的数量 { m=(m-n)/2+(m-n)%2;///送到x的数量+自我合并的数量 } else///如果y的数量小于x的数量,x类型的自我合并 { n=(n+m)/2+(n+m)%2; } } while(n) { n--; n=n/2+n%2; if(n==0) { break; } ans+=x; } printf("%d\n",ans); } return 0; }