励志用少的代码做高效表达。


思路分析

题意:给定n个数,问最少操作几次,使数列中的数全部相等。
操作一:将数列中任意数减一。
操作二:将数列中任意数减一。任意数加一(相当于把1挪过去)

涉及到最少的题,一定就是贪心了, 当然,本题考思维多一点,如果只是单纯的贪,会很麻烦。

首先求出平均数n

最开始的思路是:将>n的数的溢出值,挪给<n的数。 最后将多出来的数直接减掉。

思路可行, 但这不是最优化的解法。

想一想我们最终的目的:要求最后的值一样,因此可以这样简化:对>n的数的溢出部分累加, 输出累加和即可。 因为相加和相减是相对的,只要求出了>n要操作的次数, <n的部分自然就处理掉了(只考虑相对的情况,类似博弈论)

优化前的代码(耗时800ms):

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main() {ios::sync_with_stdio(false);int T; cin>>T; while(T--) {long long n, sum = 0;  cin>>n;for(int i = 0; i < n; i++) { cin>>a[i]; sum+=a[i]; }long long sum1=0, sum2=0;sum /= n;for(int i = 0; i < n; i++) if(a[i] > sum) sum1 += a[i]-sum;else sum2 += fabs(sum-a[i]);cout << (long long)(min(sum1,sum2)+fabs(sum1-sum2)) << endl;}
return 0; }

注意:在第16行代码里,变量进行运算后,其取值范围会改变成int行变量的范围,需加强转,否则溢出。


优化后的代码(耗时160ms)

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main() {ios::sync_with_stdio(false);int T; cin>>T; while(T--) {long long n, sum = 0;  cin>>n;for(int i = 0; i < n; i++) { cin>>a[i]; sum+=a[i]; }long long sum1=0;sum /= n;for(int i = 0; i < n; i++) if(a[i] > sum) sum1 += a[i]-sum;cout << (long long)(sum1) << endl;}
return 0; }

15行代码AC——ZOJ - 4118 Stones in the Bucket(思维题+优化方案)(第十届山东省ACM程序设计竞赛F题)相关推荐

  1. 15行代码AC——1019 数字黑洞 (20分) 甲级1069. The Black Hole of Numbers (20)(解题报告)

    立志用更少的代码做更高效的表达 PAT甲级最优题解-->传送门 Pat乙级最优化代码+题解+分析汇总-->传送门 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非 ...

  2. (解题报告)L1-032 Left-pad (20分)——15行代码AC

    立志用更少的代码做更高效的表达 根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块 ...

  3. 1032 挖掘机技术哪家强 (20分)——15行代码AC

    立志用更少的代码做更高效的表达 PAT乙级最优题解-->传送门 为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输 ...

  4. 15行代码AC——Link/Cut Tree CodeForces - 614A(爆long long处理+快速幂讲解)

    励志用少的代码做高效表达 Problem describe Programmer Rostislav got seriously interested in the Link/Cut Tree dat ...

  5. 15行代码AC——习题3-3 数数字 (UVa1225,Digit Counting)

    大意: 把n(n<=10000)个整数顺序写在一起,求0~9分别出现多少次 Sample Input 2 3 13 Sample Output 0 1 1 1 0 0 0 0 0 0 1 6 2 ...

  6. 15行代码AC——习题3-1 得分 (UVa1585,Score)

    题意概述 给出一个由O和X组成的串,统计得分,O得分为目前连续出现的O的个数,X的得分为0. 如:OOXXOXXOOO得分为:1+2+0+0+1+0+0+1+2+3=10 Sample Input 5 ...

  7. 测试点3的分析:1022 D进制的A+B (20分)——15行代码AC

    立志用更少的代码做更高效的表达 PAT乙级最优题解-->传送门 输入两个非负 10 进制整数 A 和 B (≤2​30−1),输出 A+B 的 D (1<D≤10)进制数. 输入格式: 输 ...

  8. 15行代码AC——习题5-5 复合词(Compound Words, UVa 10391)——解题报告

    励志用少的代码做高效的表达 题目(提交)链接→UVA-10391 本题实质是#include<string>头文件的substr()字符串分割函数与#include<algorith ...

  9. 12行代码AC——L1-058 6翻了(15分)

    立志用更少的代码做更高效的表达 "666"是一种网络用语,大概是表示某人很厉害.我们很佩服的意思.最近又衍生出另一个数字"9",意思是"6翻了&quo ...

最新文章

  1. python基础(四)集合
  2. php微信开发例子,微信开发实战之知乎日报
  3. 五分之一参会者将缺席AAAI 2020,主办方被迫“在线开会”,中国作者可远程演讲...
  4. Social Media Modify case - still about attribute_ref
  5. ARC114E - Paper Cutting 2(组合数学,概率与期望)
  6. mysql的Innodb为什么使用B+树
  7. 对一个存储过程语法的解读
  8. 2017级C语言大作业 - 密室逃生
  9. P5708 【深基2.习2】三角形面积
  10. 永中文档在线预览集群部署方案
  11. oel+oracle,OEL7.6安装Oracle Database 19C(VERSION 19.3.0.0)
  12. 二. 再熟悉 Markdown 标准语法
  13. python常用的几个库_盘点Python常用的20个库
  14. 解决html图片空隙留白问题
  15. 《嵌入式 - ARM》第5章 ARM PWM
  16. AtCoder Beginner Contest 172 总结
  17. oracle表如何做统计分析,oracle统计分析表信息
  18. Android 计步器实现
  19. Java毕设项目鑫通物流车辆调度系统mp4(java+VUE+Mybatis+Maven+Mysql)
  20. 2018电力计算机英语,2018年12月英语四级作文范文33:电力短缺

热门文章

  1. MySQL(四)索引的使用
  2. Go标准库os/exec使用指南
  3. 介绍一个欧神写的剪贴板多端同步神器
  4. 曹大带我学 Go(10)—— 如何给 Go 提性能优化的 pr
  5. 区间调度之区间交集问题
  6. 多媒体技术生态未来的三个关键要素
  7. 音视频技术开发周刊 | 144
  8. 剧透LiveVideoStackCon 2020:除了干货,还有更多优惠的年度通票
  9. Pinterest:Android系统上的视频管理
  10. LiveVideoStack音视频技术2018年度评奖揭晓