集训队日常训练20181201 E 1005 : 小蝌蚪

时间限制(普通/Java):500MS/1500MS     内存限制:65536KByte
总提交: 25            测试通过:5

描述

有 n 个装着小蝌蚪的水缸排成一排,你拥有一个无限蝌蚪的袋子,可以往一个水缸里放入一只蝌蚪,也可以取出一只蝌蚪,求最少的操作数,使得每个水缸的蝌蚪数量形成一个公差为 k 等差数列。

输入

多组数据(<35),每组数据描述如下。

第一行一个数 n,k(1<=n<=105,0<=k=<104)。
第二行 n个数,表示每个水缸里的蝌蚪数目(0<=ai<=104)。

输出

每组数据输出一个最少操作次数。

样例输入

4 2
1 2 3 4
4 2
0 1 2 3

样例输出

4
6

提示

蝌蚪的个数不能为负。

题解:

最多进行多少次加减操作能使给定数列成为一个公差为k的等差数列(每次只能加或减1)

首先,先将第一个数假设为一个定值,然后改变后面的值,得到一个公差为k的等差数列,用一个数组b去记录每一个数和它应得的数的差值,此时,对第一个数进行减x的操作,那么后面每一位数都要进行减x的操作,也就是abs(b[i]-x),这个也就是每一位所要得到

应得值的次数,那么只要从0循环到n每一位都进行上述操作得到的和就是最少操作次数,x取数列中位数的时候,和为最小。但是因为应得的值都必须是正数,所以得考虑x的值,使得最后得到的数列每一位都是正数。

 1 #include "bits/stdc++.h"
 2 #define ll long long
 3 using namespace std;
 4 inline void read(int &x)
 5 {
 6     x=0;char c=getchar();
 7     while(c<‘0‘ || c>‘9‘)c=getchar();
 8     while(c>=‘0‘ && c<=‘9‘){
 9         x=x*10+c-‘0‘;
10         c=getchar();
11     }
12 }
13 inline void write(int x)
14 {
15     int y=10,len=1;
16     while(y<=x) {y*=10;len++;}
17     while(len--){y/=10;putchar(x/y+48);x%=y;}
18 }
19 ll a[100001];
20 ll b[100001];
21 int main()
22 {
23     ll n,k;
24     while(~scanf("%I64d%I64d",&n,&k))
25     {
26         scanf("%I64d",&a[0]);
27         //b[0]=a[0];
28         int p=a[0];
29         b[0]=0;
30         for(int i=1;i<n;++i)
31         {
32             scanf("%I64d",&a[i]);
33             //b[i]=b[i-1]+k-a[i]+b[i-1];
34             b[i]=p+k-a[i];
35             p+=k;
36         }
37         sort(b,b+n);
38         ll p1=a[0];
39         ll res=0;
40         if(b[n/2]>p1)for(int i=0;i<n;++i)res+=abs(b[i]-p1);
41         else for(int i=0;i<n;++i)res+=abs(b[i]-b[n/2]);
42         printf("%I64d\n",res);
43     }
44 }

原文地址:https://www.cnblogs.com/htmrc1/p/10051360.html

时间: 2024-11-02 10:35:17

集训队日常训练20181201 E 1005 : 小蝌蚪的相关文章

集训队日常训练20180513-DIV2

A.2176 给一个字符串s,问距离为D的字母对是否存在相同. 模拟 #include<bits/stdc++.h> using namespace std; int main() { string s,b; while(cin>>s) { if(s[0]=='*')break; int flag=1; map<string,int>ma; for(int jump=1;jump<s.size();jump++) { ma.clear(); for(int L=0

集训队日常训练20180525-DIV2

A.2295 求有多少素数对和等于n. 暴力. #include <bits/stdc++.h> using namespace std; int ss(int n) { int i=2,a=sqrt(n); for(;i<=a;i++) if(n%i==0) return 0; return 1; } int main() { int n; while(scanf("%d",&n),n) { int sum=0; for(int i=2;i<=n/2;

集训队日常训练20181117 DIV2

大佬们一顿操作猛如虎,拼命AC强啊 4262: 区间异或  Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 139            Accepted:58 Description zzd通过艰苦的学习,终于领悟了异或(^)的计算方法. 可是现在他面前出现了一道难题,zzd陷入了迷茫之中…你能帮帮他么? 给出一个长为N的序列{A1, A2, A3, ... , An}.求解区间[L,

了解python,利用python来制作日常猜拳,猜价小游戏

初次接触python,便被它简洁优美的语言所吸引,正所谓人生苦短,python当歌.python之所以在最近几年越发的炽手可热,离不开它的一些特点: 1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单.2.易于阅读:Python代码定义的更清晰.3.易于维护:Python的成功在于它的源代码是相当容易维护的.4.一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好.5.互动模式:互动

[日常训练]curves

Description 小同学的弟弟小昨天学习了数学中的一元二次函数,但是由于学业不精,他一个晚上都在缠着小问一元二次函数的极值问题,小烦不可耐,于是,想请你帮忙弄个程序来应付小.程序要完成以下任务: 给你个二次函数,记第个为:. 设函数. 请你求出的在区间上的最小值,结果保留位有效数字. Input 输入文件第一行是一个整数. 接下来行,每行个实数,之间有一个空格分隔. Output 输出一行一个实数,表示的在区间上的最小值. Sample Input 2 3 --2 1 2 -4 2 Sam

[日常训练]变戏法

Description 一开始有$n$个只有颜色不同的小球.定义使用一次膜法的效果是重新排列第$l_i$个到第$r_i$个小球.给定了$n$个小球的初始状态和最终状态,以及$m$次膜法的范围$l_i,r_i$.判断是否可以从初始状态转移到最终状态. Input 第一行有一个整数$t$表示数据组数. 每组数据中, 第一行两个整数$n,m$,表示总共有$n$个小球,$m$次操作. 第二行$n$个整数$a_i$,表示初始状态. 第三行$n$个整数$b_i$,表示最终状态. 接下来$m$行,每行两个整数

[日常训练]article

Description 小今天来写作文啦! 小非常善于堆砌辞藻.在洋洋洒洒写了一长篇之后,小发现作文中很多段落都似曾相识.小认为,如果一段字符在文章开头,结尾和中间都出现过,那么这段字符就可以被认为是一个"经典段". 现在小给你一篇文章,他想知道最长的一段"经典段"长度是多少? 注意,这里要求经典串至少出现三次,分别作为文章的前缀,后缀,及既非前缀也非后缀. Input 一行,给出一个由小写字母组成的字符串. Output 输出满足题目要求的非空子串,如果不存在这样

教你日常生活中美容祛斑小窍门

生活中的祛斑小窍门有很多,只要你留心,柠檬冰糖汁.黑木耳红枣汤.胡萝卜汁以及冬瓜祛斑美容汤等都是祛斑材料.这些材料不仅可以白嫩皮肤有效祛斑,而且还具有防治动脉硬化的作用.生活中的祛斑小窍门还有哪些呢? 祛斑小窍门一:美容祛斑柠檬冰糖汁 将柠檬搅汁,加冰糖适量饮用.柠檬中含有丰富的维生素C,100克柠檬汁中含维生素C可高达50毫克.此外还含有钙.磷.铁和B族维生素等.常饮柠檬汁,不仅可以白嫩皮肤,防止皮肤血管老化,有效祛斑,而且还具有防治动脉硬化的作用. 但你一定要注意:柠檬一定要去皮,因为柠檬皮

「日常训练」School Marks(Codeforces Round 301 Div.2 B)

题意与分析(CodeForces 540B) 代码 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #define MP make_pair #define PB push_back #define fi first #define se second #define ZERO(x) memset((x), 0, sizeof(x)) #define