第13届 广东工业大学ACM程序设计大赛 C题 平分游戏

题目描述

转眼间又过了一年,又有一届的师兄师姐要毕业了。

​ 有些师兄师姐就去了景驰科技实习。 在景驰,员工是他们最宝贵的财富。只有把每一个人的专业性和独特性结合在一起,他们才会获得成功。他们致力于为所有员工打造一个能够被激励,并分享公司成功的工作环境。

创新精神:为了改变人类出行而不断迎接全新挑战。

团队协作:依靠集体的智慧,坦诚无私地帮助彼此。

结果导向:在所有方面都力争做到中国第一和世界一流,并对结果负责。

共同成长:学习永无止境,通过个人发展和职业成长实现成就。

GUDTACM集训队教练孙壕又来请大家大搓一顿。

茶余饭足以后,有人提议不如来玩游戏吧。狼人杀谁是卧底跳一跳都已经玩得太多了,所以大家决定玩一个更加有挑战性的游戏。

集训队一共有n位同学,他们都按照编号顺序坐在一个圆桌旁。第i位同学一开始有a[i]个硬币,他们希望使得每位同学手上的硬币变成相同的数目。每一秒钟,有且仅有一位同学可以把自己手上的一枚硬币交给另一位同学,其中这两位同学中间必须间隔k位同学。

现在问的是最少几秒后所有同学手上的有相同数量的硬币

输入描述:

第一行输入两个整数n,k(1<=n<=1000000,0<=k<=n)
接下来的一行有n个整数,第i个整数a[i](0<=a[i]<=1e9)表示第i位同学手上的硬币的数量。

输出描述:

一个整数,表示最少几秒后所有同学手上的有相同数量的硬币。如果不可能,则输出gg。

示例1

输入

5 0
2 3 1 5 4

输出

3

思路:

先看怎么处理没有\(k\)的限制的问题,保证总数整除\(n\)是必然的。

再来处理硬币的转移问题,对于相邻的两个位置\(A,B\)来说,要么\(A\)给\(B\),要么\(B\)给\(A\),这样才能保证最优。

我们假设\(x_i\)为 第 \(i\) 个人 给了 第 \((i - 1 + n) \%n\) 个人 的硬币个数 (\(x_i < 0\)表示 后者给前者硬币)

假设平均值为\(avg\),则有如下关系

对于第0个人 \(a_0 - x_0 + x_1 = avg \rightarrow x_1 = x_0 - (a_0 - avg) \rightarrow x_1 = x_0 - C_0 (C_0 = a_0 - avg)\)

对于第1个人 \(a_1 - x_1 + x_2 + avg\rightarrow x_2 = x_1 - (a_1 - avg) \rightarrow x_2 = x_0 - (a_0 + a_1 - 2*avg) \rightarrow x_2 = x_0 - C_1(C_1 = a_0 + a_1 - 2 * avg)\)

最后的答案就是最小化 \(|x_0| + |x_1| + .... |x_{n-2}| = |x_0| +|x_0 - C_0| + |x_0 - C_1| + .... + |x_0 - C_{n-2}|\)

这个显然是在一个x轴上找到他们的中位数,答案最小。

现在来考虑存在\(k\)的限制的问题,其实就将整个环分成了\(gcd(n, k + 1)\)个独立的环,对每个环分别求解最后累加即可。

代码:

#include<bits/stdc++.h>
#define LL long long
#define P pair<int,int>
using namespace std;
const int N = 1e6 + 10;
int a[N],vis[N];
LL b[N];
int n, k;
LL cal(int cnt){
b[cnt - 1] = 0;
sort(b, b + cnt);
return b[cnt / 2];
}
int main()
{
cin>>n>>k;
k = min(k, n - 1);
LL sum = 0;
for(int i = 0;i < n;i++){
scanf("%d",a + i);
sum += a[i];
}
if(sum % n ){
puts("gg");
return 0;
}
LL ans = 0, avg = sum / n;
for(int i = 0;i < n;i++){
if(!vis[i]){
int j = i,cnt = 0;
LL tmp = 0,p = 0;
while(!vis[j]){
vis[j] = 1;
b[cnt] = a[j] - avg + p, tmp += a[j];
p = b[cnt++];
j = (j + k + 1) % n;
}
if(tmp % cnt || tmp / cnt != avg){
puts("gg");
return 0;
}
LL midnum = cal(cnt);
for(int k = 0;k < cnt;k++) ans += abs(midnum - b[k]);
}
}
printf("%lld\n",ans);
return 0;
}

第13届 广东工业大学ACM程序设计大赛 C题 平分游戏的更多相关文章

  1. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 B题 跳一跳,很简单的(字符串Hash + 树上路径倍增)

    题目链接  2018广东工业大学校赛  Problem B 考虑到每条边的权值变化$26$个时刻之后一定会回到原来的状态. 那么预处理出前$26$个时刻每棵树的形态,对每棵树做一遍字符串哈希. 查询的 ...

  2. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--D-psd面试

    链接:https://www.nowcoder.com/acm/contest/90/D 来源:牛客网 1.题目描述 掌握未来命运的女神 psd 师兄在拿了朝田诗乃的 buff 后决定去实习. 埃森哲 ...

  3. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛

    拖了好久了 链接:https://www.nowcoder.com/acm/contest/90/A来源:牛客网 跳台阶 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K, ...

  4. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛-等式(求$N^2$的因子个数)

    一.题目链接 https://www.nowcoder.com/acm/contest/90/F 二.题面 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言655 ...

  5. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--J-强迫症的序列

    链接:https://www.nowcoder.com/acm/contest/90/J 来源:牛客网 1.题目描述 牛客网是IT求职神器,提供海量C++.JAVA.前端等职业笔试题库,在线进行百度阿 ...

  6. 【第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛-L】用来作弊的药水

    链接:https://www.nowcoder.com/acm/contest/90/L来源:牛客网 输入x,a,y,b,(1<=x,a,y,b<=10^9)判断x^a是否等于y^b 前面 ...

  7. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--L-用来作弊的药水

    链接:https://www.nowcoder.com/acm/contest/90/L 来源:牛客网 1.题目描述 -- 在一个风雨交加的夜晚,来自异世界的不愿透露姓名的TMK同学获得了两种超强药水 ...

  8. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--I-填空题

    链接:https://www.nowcoder.com/acm/contest/90/I 来源:牛客网 1.题目描述 牛客网是是一个专注于程序员的学习和成长的专业平台,集笔面试系统.课程教育.社群交流 ...

  9. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--K-密码

    链接:https://www.nowcoder.com/acm/contest/90/K 来源:牛客网 - 1.题目描述 ZiZi登录各种账号的时候,总是会忘记密码,所以他把密码都记录在一个记事本上. ...

随机推荐

  1. 如何实现最佳的跨平台游戏体验?Unity成亮解密实时渲染

    7月31日,2018云创大会游戏论坛在杭州国际博览中心103B圆满举行.本场游戏论坛聚焦探讨了可能对游戏行业发展有重大推动的新技术.新实践,如AR.区块链.安全.大数据等. Unity大中华区技术经理 ...

  2. hive和关系型数据库

    1)hive和关系型数据库存储文件的系统不同.  hive使用hdfs(hadoop的分布式文件系统),关系型数据库则是服务器本地的文件系统: 2)hive使用的计算模型是mapreduce,而关系型 ...

  3. 「日常训练」Kefa and Park(Codeforces Round #321 Div. 2 C)

    题意与分析(CodeForces 580C) 给你一棵树,然后每个叶子节点会有一家餐馆:你讨厌猫(waht?怎么会有人讨厌猫),就不会走有连续超过m个节点有猫的路.然后问你最多去几家饭店. 这题我写的 ...

  4. 【CQOI 2007】 余数求和

    题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如G(10, 5)=5 ...

  5. HTML 之 表单

    关于HTML的表单 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...

  6. [git] Git in Practice

    Work flow with git and github Work with Remotes Check the current status git status Check the latest ...

  7. 使用DataTables导出html表格

    去年与同事一起做一个小任务,需要把HTML表格中的数据导出到Excel.用原生js想要实现,只有IE浏览器提供导出到微软的Excel的接口,这就要求你电脑上必须安装IE浏览器.Excel,而且必须修改 ...

  8. Memory及其controller芯片整体测试方案(上篇)

    如果你最近想买手机,没准儿你一看价格会被吓到手机什么时候偷偷涨价啦! 其实对于手机涨价,手机制造商也是有苦难言,其中一个显著的原因是存储器芯片价格的上涨↗↗↗ >>> 存储器memo ...

  9. Pipeline组测试说明

    PIPELINE组测试报告 前言:我们组与学霸系统的其他两个小组共同合作开发,组成学霸系统的团体工作.作为学霸系统的一环,我们组起到承上启下的作用,因此,面向群体以及功能实现都是为给下一个组的工作做好 ...

  10. JavaScript初探系列之String的基本操作

    1.字符串转换 字符串转换是最基础的要求和工作,你可以将任何类型的数据都转换为字符串,你可以用下面三种方法的任何一种: var myStr = num.toString(); // "19& ...