array

      by ysy

【题目描述】

给定一个长度为n的数列,每次你可以进行以下操作之一:

(1)将一个数+a;

(2)将一个数-a;

(3)将一个数+b;

(4)将一个数-b;

你需要将所有数全部变为0,求最小操作数。

【输入数据】

第一行三个整数n,a,b,第二行n个整数x1~xn表示数列。

【输出数据】

一行一个整数表示答案。无解输出-1。

【样例输入】

2 2 3

1 2

【样例输出】

3

【数据范围】

对于10%的数据,n,a,b,|xi|<=1000。

对于30%的数据,n,a,b<=1000。

对于另外10%的数据,a=1。

对于另外10%的数据,a=2,b=3。

对于100%的数据,1<=n<=105,1<=a,b<=109,|xi|<=109

【题解思路】

很容易转化成数学模型:ax+by = c,使(|x|+|y|)min。

对于方程ax+by = c,我们可以用exgcd求出一组解。

当a,b互质时,保证ax+by = c有解。

设d = gcd(a,b).a/d*x+b/d*y = c/d;

此时可求出一组特解:x',y'。

则ax+by = c的通解可以表示为:x = c/d * x' + k * b/d,y = c/d * y' - k * a/d;

然后如何使(|x|+|y|)min。考虑到对于上述通解,我们可以打表或意念理解,这是个单峰函数。

即存在唯一且确定值k,使得|c/d*x' + k*b/d|+|c/d*y' - k* a/d|最小,尽可能使绝对值接近零,那么对于这两个数使得x取得最小的正数或最大的负数(绝对值尽量接近0)。

时间复杂度 O(nlog|xi|)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define rep(k,i,j) for(int k = i;k <= j; ++k)
#define FOR(k,i,j) for(int k = i;k >= j; --k)
inline int read(){
int x=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
int n,a,b,k;
inline void exgcd(int a,int b,int m,ll &x,ll &y){
if(!b) x = m/a,y = ;
else {
exgcd(b,a%b,m,x,y);
swap(x,y);
y -= a/b*x;
}
}
inline int gcd(int a,int b){return b ? gcd(b,a%b) : a;}
ll x,y,p;
int main(){
freopen("array.in","r",stdin);
freopen("array.out","w",stdout);
n = read(),a = read(),b = read();
k = gcd(a,b);
a /= k,b /= k;
if(a<b) swap(a,b);
rep(i,,n){
int j = read();
if(j%k) printf("-1\n"),exit();
exgcd(a,b,j/k,x,y);
if(y<) {
x -= b*((-y)/a+);
y += a*((-y)/a+);
}
x += b*(y/a);
y -= a*(y/a);
p += min(abs(x)+abs(y),abs(x+b)+abs(y-a));
}
printf("%lld\n",p);
return ;
}
/*
2 2 3
1 2
*/

noip模拟【array】的更多相关文章

  1. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  2. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

  3. CH Round #49 - Streaming #4 (NOIP模拟赛Day2)

    A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...

  4. CH Round #48 - Streaming #3 (NOIP模拟赛Day1)

    A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...

  5. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  6. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  7. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  8. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  9. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  10. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

随机推荐

  1. sql server case

    use mytest go exec p_city 2,4 exec p_city_cnt 2,3 select stuff((select ',' + city_id from cities for ...

  2. SV通过DPI调用C

    Verilog与C之间进行程序交互,PLI(Programming Language Interface)经过了TF,ACC,VPI等模式. 使用PLI可以生成延时计算器,来连接和同步多个仿真器,并可 ...

  3. python random函数

    .random模块方法说明 random.random()函数是这个模块中最常用的方法了,它会生成一个随机的浮点数,范围是在0.0~1.0之间. random.uniform()正好弥补了上面函数的不 ...

  4. jQuery样式--css(name|pro|[,val|fn])

    css(name|pro|[,val|fn]) 概述 访问匹配元素的样式属性 参数 name  要访问的属性名称 name  一个或多个CSS属性组成的一个数组 properties  要设置为样式属 ...

  5. mysql使用navicat编写调用存储过程

    在Navicat里面,找到函数,右键,新建函数,选择过程,如果有参数就填写函数,如果没有就直接点击完成 在BEGIN......END中间编写要执行的sql语句,例如下面存储过程取名为pro_data ...

  6. 【Hadoop学习之八】MapReduce开发

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 伪分布式:HDFS和YARN 伪分 ...

  7. QtCreator 调试源码

    [1]安装源码 声明:要想调试进入Qt源码,必须首先保证我们安装了Qt源码.下面说明安装Qt源码注意事项. 一般安装过程(默认不安装源码): 安装源码过程(需要自己设置,点击“全选”): 综上所述:Q ...

  8. Beta分布深入理解

    一些公式 Gamma函数 (1) 贝叶斯公式 (2) 贝叶斯公式计算二项分布概率 现在有一枚未知硬币,我们想要计算抛出后出现正面的概率.我们使用贝叶斯公式计算硬币出现正面的概率.硬币出现正反率的概率和 ...

  9. JS实战

    1. jquery取消点击事件 $("#dashboard").unbind("click"); 2.jquery绑定鼠标滑过,离开事件 $("#da ...

  10. K-Means算法的Java实现

    K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则.K-means算法以欧式距离作为相似 ...