15行代码AC——ZOJ - 4118 Stones in the Bucket(思维题+优化方案)(第十届山东省ACM程序设计竞赛F题)
励志用少的代码做高效表达。
思路分析
题意:给定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题)相关推荐
- 15行代码AC——1019 数字黑洞 (20分) 甲级1069. The Black Hole of Numbers (20)(解题报告)
立志用更少的代码做更高效的表达 PAT甲级最优题解-->传送门 Pat乙级最优化代码+题解+分析汇总-->传送门 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非 ...
- (解题报告)L1-032 Left-pad (20分)——15行代码AC
立志用更少的代码做更高效的表达 根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块 ...
- 1032 挖掘机技术哪家强 (20分)——15行代码AC
立志用更少的代码做更高效的表达 PAT乙级最优题解-->传送门 为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输 ...
- 15行代码AC——Link/Cut Tree CodeForces - 614A(爆long long处理+快速幂讲解)
励志用少的代码做高效表达 Problem describe Programmer Rostislav got seriously interested in the Link/Cut Tree dat ...
- 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 ...
- 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 ...
- 测试点3的分析:1022 D进制的A+B (20分)——15行代码AC
立志用更少的代码做更高效的表达 PAT乙级最优题解-->传送门 输入两个非负 10 进制整数 A 和 B (≤230−1),输出 A+B 的 D (1<D≤10)进制数. 输入格式: 输 ...
- 15行代码AC——习题5-5 复合词(Compound Words, UVa 10391)——解题报告
励志用少的代码做高效的表达 题目(提交)链接→UVA-10391 本题实质是#include<string>头文件的substr()字符串分割函数与#include<algorith ...
- 12行代码AC——L1-058 6翻了(15分)
立志用更少的代码做更高效的表达 "666"是一种网络用语,大概是表示某人很厉害.我们很佩服的意思.最近又衍生出另一个数字"9",意思是"6翻了&quo ...
最新文章
- python基础(四)集合
- php微信开发例子,微信开发实战之知乎日报
- 五分之一参会者将缺席AAAI 2020,主办方被迫“在线开会”,中国作者可远程演讲...
- Social Media Modify case - still about attribute_ref
- ARC114E - Paper Cutting 2(组合数学,概率与期望)
- mysql的Innodb为什么使用B+树
- 对一个存储过程语法的解读
- 2017级C语言大作业 - 密室逃生
- P5708 【深基2.习2】三角形面积
- 永中文档在线预览集群部署方案
- oel+oracle,OEL7.6安装Oracle Database 19C(VERSION 19.3.0.0)
- 二. 再熟悉 Markdown 标准语法
- python常用的几个库_盘点Python常用的20个库
- 解决html图片空隙留白问题
- 《嵌入式 - ARM》第5章 ARM PWM
- AtCoder Beginner Contest 172 总结
- oracle表如何做统计分析,oracle统计分析表信息
- Android 计步器实现
- Java毕设项目鑫通物流车辆调度系统mp4(java+VUE+Mybatis+Maven+Mysql)
- 2018电力计算机英语,2018年12月英语四级作文范文33:电力短缺