博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ - 3981 - Balloon Robot (思维)
阅读量:7262 次
发布时间:2019-06-29

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

参考自:

题意:

第一行三个数字n, m, q表示有m个座位围成一个环,n个队伍,q次A题

接下来n个数表示n个队伍所在位置(1<=ai<=m)

再接下来q行,每行a, b表示第a个队伍在第b秒A了一道题

有一个只会每一秒顺时针移动一个位置的发气球机器人

只要当前队伍有题目已经A了就会给他对应数量的气球(当然每道题最多1个气球)

如果a队伍在b时刻A了一道题,并在c时刻才拿到气球,那么这个队伍就会积累c-b点不开心值

求一个机器人起始位置(一开始是第0秒)使得所有队伍最终不开心值之和最小

思路:

对于一次ac,不开心值 = 当前位置 - 初始位置 - ac时间 也就是 不开心值 = a[i] - 1 - time

假设机器人现在是在1位置,计算出了所有交题的不开心值的和sum,现在改变初始位置1,变为x

现在的不开心值 = sum - 改变位置后减少的时间 + 改变位置后增加的时间

改变位置后减少的时间 = (p - x) * dis[x]

改变位置后增加的时间 = (m - dis[x]) * x

sum - (p - x) * dis[x] + x * (m - dis[x]) = sum + m * x - dis[x] * p

代码:

#include
#include
#include
using namespace std;typedef long long ll;const int maxn = 2e6+10;ll dis[maxn], a[maxn];int main() { ll t, n, m, p; scanf("%d", &t); while(t--) { ll x, time, sum = 0; scanf("%lld %lld %lld", &n, &m, &p); for(int i = 1; i <= n; i++) { scanf("%lld", &a[i]); } for(int i = 0; i < p; i++) { scanf("%lld %lld", &x, &time); dis[i] = (a[x]-1-time+m) % m; sum += dis[i]; } ll ans = 0x3f3f3f3f3f3f3f3fLL; sort(dis,dis+p); for(int i = 0; i < p; i++) { ans = min(ans, sum+m*i-dis[i]*p); } printf("%lld\n", ans); } return 0;}

转载于:https://www.cnblogs.com/somliy/p/9740397.html

你可能感兴趣的文章
java数据类型
查看>>
input onchange事件
查看>>
Laravel Homestead 离线安装
查看>>
Kruskal算法模拟讲解
查看>>
shell调试【转】
查看>>
多国电子书盈利模式分析
查看>>
2018年广西与东盟欧盟双边贸易额实现双增长
查看>>
上海迪士尼度假区扩建项目 将增“疯狂动物城”主题园区
查看>>
字符串 Intern 机制
查看>>
Java树形数据的面试题
查看>>
Android小知识-Java多线程相关(线程间通信)上篇
查看>>
Swift重写父类属性
查看>>
vue双向绑定原理
查看>>
在使用第三方库时,升级了版本出现了Bug该怎么办
查看>>
Hexo and GitHub Pages 博客搭建
查看>>
阿里云异构计算团队亮相英伟达2018 GTC大会
查看>>
SpringBoot系列教程之RedisTemplate String数据结构使用教程
查看>>
Python字典小结
查看>>
LeetCode 234——回文链表
查看>>
Windows下MongoDB安装副本集
查看>>