题意:

一个机器人在长为M的圆形轨道上送气球,当机器人到达M号点的时候下一站会回到1号点,且全程不会停止运动。现在在长为M的轨道上有N个队伍,队伍会在某个时间做需要一个气球,机器人需要送过去。一共有P次请求,每一次请求a、b 表示a号在b时间需要气球。现在给定P次请求和N个队伍在轨道上的位置,机器人在0时刻可在轨道上的任意节点开始。计算从那个节点开始每个请求收到气球的时间t-请求的时间b的差的和的最小值。

思路:

任意选择一个起点 ,算出每次请求的t-b的值并保存在数组h中,值的范围在(0~m-1)之间。若起点向后移动一个则数组h中的数据都加一,且等于M的都变为0。由于M有10的9次方所以不能遍历所有的可能。
所以将h数组排序,每次将最大值变为0,即整个数组都加上(m-最大值)。

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std; int main()
{
int t;
long long n,m,p;
long long a[],h[];
cin>>t;
while(t--)
{
long long ans=;
scanf("%lld%lld%lld",&n,&m,&p);
for(int i=;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=;i<p;i++)
{
long long x,y;
scanf("%lld%lld",&x,&y);
h[i]=(a[x]-(y%m)+m)%m; //计算数组h,即某点开始的位次请求的值
ans+=h[i];
}
long long sum=ans,pi=;
sort(h,h+p);
for(int i=p-;i>=;i--)
{
int g=;
while(h[i-g]==h[i]&&i-g>=) g++; //求最大值的个数
h[i]+=pi; //pi表示再次之前已经补充了的最大值的数
pi+=(m-h[i]);
ans+=(p-g)*(m-h[i]); // 计算此时的和
ans-=g*h[i];
sum=min(sum,ans);
i-=g-; //每次移动到下一个最大值
}
printf("%lld\n",sum);
}
return ;
}

最新文章

  1. Python杨辉三角算法
  2. div垂直居中的问题
  3. 用Chrome在电脑上模拟微信浏览器
  4. [反汇编练习] 160个CrackMe之010
  5. JavaScript中事件绑定的方法总结
  6. SVN 代码下载,上传
  7. DataGuard failover dg role自动切换模式测试
  8. OD调试篇1—Hello
  9. android 配置环境变量
  10. 同台交换机同样VLAN能够通信,不同VLAN不可通信
  11. 多校 Babelfish
  12. jenkins、ant、selenium、testng搭建自动化测试框架
  13. 完美解决浮动IE6 7中的兼容性BUG问题
  14. 关于js中对象和函数的一道问题
  15. JS设计模式(14)适配器模式
  16. CDI
  17. Ubuntu系统多屏幕时 触摸屏如何分屏定位
  18. usaco Transformations
  19. MySQL中 PK NN UQ BIN UN ZF AI 的意思
  20. ubuntu安装包查找及安装

热门文章

  1. js 调试技巧
  2. 洛谷P1041 传染病控制
  3. 【CH6802】车的放置
  4. Command `bundle` unrecognized. Make sure that you have run `npm install` and that you are inside a react-native project.
  5. Nginx.conf配置文件参数说明与优化
  6. ubuntu vim01
  7. (贪心和优先队列) POJ1862 Stripies
  8. vue实现购物车和地址选配
  9. Harbor作为Docker的镜像中心
  10. qml: QtCharts模块得使用(数据整合和显示) ---- &lt;二&gt;