zoj 3981 Balloon Robot
https://vjudge.net/problem/ZOJ-3981
题意:
有m个座位,其中n个队伍坐在这些位置上,一个队伍一个座位。当一个队A了题之后,他们们会得到气球,假设他们在a时刻A题,但是在b时刻才得到气球,那么他们的不高兴值就会增加b - a。现在主办方安排了一个机器人发气球,机器人每时刻都会向右移动一个位置(当然是循环的),到了一个位置,如果这个位置上有队伍并且A了题没有得到气球,那么就会把气球发给这个队伍。现在给出每个队伍的位置和A题的情况,要求安排机器人的起始位置使得所有队伍的不开心值之和最小。
思路:
首先可以假设机器人在1位置,计算出每个题的气球需要等待的时间,然后接下来证明一个猜想,枚举的时间点必然是A题的时刻:
假设在当前枚举的时刻t没有A题,那么在枚举到t+1时刻,那么必然所有的A题的等待时间会减少1,直到有A题的时刻之后,时间才会增加。
首先把每个的等待时间排个序(求等待时间的时候,使用了二分法),之后顺序枚举
公式 ans = min(sum + i * m - d[i] * q),因为前面的A题时刻在起点后移之后必定会从m - 1开始递减的,所以有加上i * m,然后全部的等待时间都会减少d[i],所以每一个都减去。
总的时间复杂度为O(n)。
代码:
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std; int d[];
int pos[]; bool meet(long long k,int tmp,int m,int b)
{
long long ans = k * m + tmp; if (ans >= b) return true;
else return false;
} int main()
{
int t; scanf("%d",&t); while (t--)
{
int n,m,p; scanf("%d%d%d",&n,&m,&p); long long sum = ; for (int i = ;i <= n;i++)
scanf("%d",&pos[i]); for (int i = ;i < p;i++)
{
int a,b; scanf("%d%d",&a,&b); a = pos[a]; long long l = ,r = ; int tmp = a - ; while (l < r - )
{
long long mid = (l + r) >> ; if (meet(mid,tmp,m,b)) r = mid;
else l = mid + ;
} while (meet(r - ,tmp,m,b)) r--; d[i] = r * m + tmp - b; sum += d[i]; //printf("%d 233\n",d[i]);
} sort(d,d+p); long long ans = ; for (int i = ;i < p;i++)
{
long long tmp = sum + (long long)i * m - (long long) p * d[i]; ans = min(tmp,ans);
} printf("%lld\n",ans);
} return ;
}
zoj 3981 Balloon Robot的更多相关文章
- ZOJ - 3981 - Balloon Robot (思维)
参考自:https://blog.csdn.net/qq_36553623/article/details/78445558 题意: 第一行三个数字n, m, q表示有m个座位围成一个环,n个队伍,q ...
- ZOJ 3981 && 2017CCPC秦皇岛 A:Balloon Robot(思维题)
A - Balloon Robot Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Sub ...
- 2017 秦皇岛CCPC Balloon Robot (ZOJ 3981)
题意:给出n个队伍,m个座位,q次A题的队伍与时间,下一行是n个队伍的坐的位置,再下面q行就是第x个队再第y秒A出一道题,然后有一个机器人,开始位置由你选,他每走一步 他就会向右走一格,走到m的时候会 ...
- ZOJ 3981:Balloon Robot(思维+递推)
题目链接 题意 有n支队在m个位置上做题,有一个机器人位置1到位置m再到位置1循环走派发气球,当队伍a在时间b做完了一道题目的时候,假如机器人走到队伍a的位置的时间为c,那么这个队伍的不开心值就是c- ...
- Balloon Robot ZOJ - 3981
大意: n个参赛队, m个座位, 一共交了p次题, 一个机器人每秒钟会从位置$i$走到$i+1$, 若在$m$直接走到$1$, 当走到一个队伍就给该队应得的气球. 对于每道题, 假设交题时间$t_a$ ...
- zoj 3717 - Balloon(2-SAT)
裸的2-SAT,详见刘汝佳训练指南P-323 不过此题有个特别需要注意的地方:You should promise that there is still no overlap for any two ...
- 2017CCPC秦皇岛 A题Balloon Robot&&ZOJ3981【模拟】
题意: 一个机器人在长为M的圆形轨道上送气球,当机器人到达M号点的时候下一站会回到1号点,且全程不会停止运动.现在在长为M的轨道上有N个队伍,队伍会在某个时间做需要一个气球,机器人需要送过去.一共有P ...
- 【推导】zoj3981 Balloon Robot
题意:一个桌子有m个位置(首尾相接),有n支队伍坐在其中的n个位置上.有个机器人会从某个起始位置出发,每个时刻会依次发生以下三个事件: 机器人顺时针转一个单位: 某些队伍通过了题目(如果存在): 如果 ...
- ZOJ 3717 Balloon ( TLE )
正解2-SAT. 我用DLX想搜一搜的,结果TLE了…… 没什么遗憾,最起码我尝试过了. 扔个代码留作纪念. #include <cstdio> #include <cstring& ...
随机推荐
- modal verbs(一)
什么是modal verb?翻译成中文就是情态动词. modal的意思是模式的,情态的,形式的.Bootstrap中的模态框就是这个词modal. 情态动词翻译挺准确的,就是表达说话人的情绪,态度或语 ...
- Linux chgrp命令
在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...
- Python 中 Iterator(迭代器)和Iterable(迭代对象)的区别
直接可以用作for循环的数据类型有以下几种: tuple.list.dict.str等, 上述数据类型可以用作for循环的叫做可迭代对象Iterable.可以使用isinstance判断一个对象是否是 ...
- VUE请求本地数据的配置json-server
VUE开发请求本地数据的配置,早期的vue-lic下面有dev-server.js和dev-client.js两文件,请求本地数据在dev-server.js里配置,最新的vue-webpack-te ...
- Algorithm --> 矩阵链乘法
动态规划--矩阵链乘法 1.矩阵乘法 Note:只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义.一个m×r的矩阵A左乘一个r×n的矩阵B,会得到一个m×n的矩阵C. #include ...
- KVM之五:KVM日常管理常用命令
1.查看.编辑及备份KVM 虚拟机配置文件 以及查看KVM 状态: 1.1.KVM 虚拟机默认的配置文件在 /etc/libvirt/qemu 目录下,默认是以虚拟机名称命名的.xml 文件,如下,: ...
- MySQL的入门
SHOW VARIABLES LIKE 'storage_engine%' #查看引擎 ALTER TABLE `studten` RENAME `student1` #修改表名 ALTER TABL ...
- Mysql加密解密随机函数
MD5(str) md5加密 SELECT MD5('hello') 5d41402abc4b2a76b9719d911017c592 sha(str) sha加密 SELECT SHA('hello ...
- 如何防止cookie被串改
在这里我不想多说怎么去操作cookie了,网上博文一大堆,大家可以去自行搜索,在这里也是记录一下自己的知识,以便以后方便查阅.当我们在浏览器地址栏输入地址成功打开网页以后,服务器会把一些信息写入coo ...
- Linux x86_64内核中断初始化
Linux x86_64内核中断初始化 [TOC] 中断分类 Linux系统中,中断分为: 硬中断:由外部设备或者执行异常产生的需要快速处理的中断.如缺页中断.定时器硬件中断. 根据内部产生还是外部产 ...