博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【推导】zoj3981 Balloon Robot
阅读量:5796 次
发布时间:2019-06-18

本文共 1144 字,大约阅读时间需要 3 分钟。

题意:一个桌子有m个位置(首尾相接),有n支队伍坐在其中的n个位置上。有个机器人会从某个起始位置出发,每个时刻会依次发生以下三个事件:

机器人顺时针转一个单位;

某些队伍通过了题目(如果存在);

如果机器人的当前的位置的队伍需求气球,机器人就会把他需求的气球都给他。

让你对于所有可能的初始位置,最小化所有队伍的所有题目的气球等待时长之和。

 

设一个函数y轴是等待时间,x轴是机器人的初始位置,于是每道题恰好被分成了两个斜率为-1的一次函数。

假设某道题目是在ci时刻由bi位置的队伍通过的,y=(bi-(x+ci)%m+m)%m

最小化每个位置所有函数图像到x轴的距离之和。

只需要枚举每个一次函数与x轴的交点,尝试用当前位置的值更新答案。

单题的函数画出来是这样的。

#include
#include
using namespace std;typedef long long ll;ll ans,sum;int n,m,K,T,s[100005],b[100005],c[100005],x[100005];int main(){ scanf("%d",&T); for(;T;--T){ ans=sum=0; scanf("%d%d%d",&n,&m,&K); for(int i=1;i<=n;++i){ scanf("%d",&s[i]); --s[i]; } for(int i=1;i<=K;++i){ scanf("%d%d",&b[i],&c[i]); b[i]=s[b[i]]; } for(int i=1;i<=K;++i){ x[i]=(b[i]-c[i]%m+m)%m; sum+=(ll)x[i]; } sort(x+1,x+K+1); ans=sum; for(int i=1;i<=K;++i){ sum-=(ll)(x[i]-x[i-1])*(ll)K; ans=min(ans,sum); sum+=(ll)m; } printf("%lld\n",ans); } return 0;}

转载于:https://www.cnblogs.com/autsky-jadek/p/7773720.html

你可能感兴趣的文章
棋盘游戏中的AI人工智能(一)
查看>>
Intellij IDEA 配置最简单的maven-struts2环境的web项目
查看>>
在Java中生成专业的公文文档
查看>>
转载:小米手机自带授权管理实现禁止自启动程序
查看>>
基于MongoDB位置查询GEO信息
查看>>
Qt ,mac osx ios x11 高清屏,视网膜的支持
查看>>
easyUI中的treeGrid---加载数据的格式
查看>>
C语言--字节对齐
查看>>
jQuery对表单元素的取值和赋值操作代码
查看>>
使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATI
查看>>
git 设置不需要输入密码
查看>>
java流程控制语句--while
查看>>
安装discuz x2.5
查看>>
squid反向代理配置,作为web服务器的前端内容缓存器。
查看>>
常用Mac、iPhone应用推荐
查看>>
MySQL JOIN连接查询知识点
查看>>
Lisp 几种方言的一些区别
查看>>
Android之倒计时CountdownTimer用法
查看>>
golang 版本的 crontab
查看>>
Cscope的使用(领略Vim + Cscope的强大魅力)
查看>>