链接:

https://vjudge.net/problem/CodeForces-721D

题意:

Recently Maxim has found an array of n integers, needed by no one. He immediately come up with idea of changing it: he invented positive integer x and decided to add or subtract it from arbitrary array elements. Formally, by applying single operation Maxim chooses integer i (1 ≤ i ≤ n) and replaces the i-th element of array ai either with ai + x or with ai - x. Please note that the operation may be applied more than once to the same position.

Maxim is a curious minimalis, thus he wants to know what is the minimum value that the product of all array elements (i.e. ) can reach, if Maxim would apply no more than k operations to it. Please help him in that.

思路:

贪心对每一个绝对值最小的值处理,小于0就减,大于等于0就加.等于0注意要当大于0考虑.

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL; const int MAXN = 2e5+10; struct Node
{
int pos;
LL val;
bool operator < (const Node& that) const
{
return abs(this->val) > abs(that.val);
}
}node[MAXN];
int n;
LL k, x; void Solve()
{
priority_queue<Node> que;
for (int i = 1;i <= n;i++)
que.push(node[i]);
while (k)
{
Node now = que.top();
que.pop();
if (now.val >= 0)
now.val += x;
else
now.val -= x;
que.push(now);
k--;
}
while (!que.empty())
{
node[que.top().pos] = que.top();
que.pop();
}
for (int i = 1;i <= n;i++)
printf("%lld ", node[i].val);
printf("\n");
} int main()
{
scanf("%d %d %lld", &n, &k, &x);
int cnt = 0;
for (int i = 1;i <= n;i++)
{
scanf("%lld", &node[i].val);
node[i].pos = i;
if (node[i].val < 0)
cnt++;
}
if (cnt == 0)
{
int mpos = 1;
for (int i = 1;i <= n;i++)
{
if (node[i].val < node[mpos].val)
mpos = i;
}
LL ti = (node[mpos].val+1LL+x-1)/x;
if (ti > k)
node[mpos].val -= k*x;
else
node[mpos].val -= ti*x;
k -= min(ti, k);
}
else if (cnt > 0 && cnt%2 == 0)
{
int mpos = 1;
for (int i = 1;i <= n;i++)
{
if (abs(node[i].val) < abs(node[mpos].val))
mpos = i;
}
if (node[mpos].val >= 0)
{
LL ti = (node[mpos].val+1LL+x-1)/x;
if (ti > k)
node[mpos].val -= k*x;
else
node[mpos].val -= ti*x;
k -= min(ti, k);
}
else
{
LL ti = (abs(node[mpos].val)+1LL+x-1)/x;
if (ti > k)
node[mpos].val += k*x;
else
node[mpos].val += ti*x;
k -= min(ti, k);
}
}
Solve(); return 0;
}

CodeForces-721D-Maxim and Array(优先队列,贪心,分类讨论)的更多相关文章

  1. CodeForces 721D Maxim and Array

    贪心,优先队列. 先看一下输入的数组乘积是正的还是负的. ①如果是负的,也就是接下来的操作肯定是让正的加大,负的减小.每次寻找一个绝对值最小的数操作就可以了. ②如果是正的,也是考虑绝对值,先操作绝对 ...

  2. Codeforces F. Maxim and Array(构造贪心)

    题目描述: Maxim and Array time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  3. Codeforces G. Nick and Array(贪心)

    题目描述: Nick had received an awesome array of integers a=[a1,a2,…,an] as a gift for his 5 birthday fro ...

  4. Codeforces Round #374 (Div. 2) D. Maxim and Array 贪心

    D. Maxim and Array 题目连接: http://codeforces.com/contest/721/problem/D Description Recently Maxim has ...

  5. Codeforces Round #374 (Div. 2) D. Maxim and Array —— 贪心

    题目链接:http://codeforces.com/problemset/problem/721/D D. Maxim and Array time limit per test 2 seconds ...

  6. Codeforces Round #374 (Div. 2) D. Maxim and Array 线段树+贪心

    D. Maxim and Array time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array 分类讨论连续递推dp

    题意:给出一个 数列 和一个x 可以对数列一个连续的部分 每个数乘以x  问该序列可以达到的最大连续序列和是多少 思路: 不是所有区间题目都是线段树!!!!!! 这题其实是一个很简单的dp 使用的是分 ...

  8. Codeforces 437C The Child and Toy(贪心)

    题目连接:Codeforces 437C  The Child and Toy 贪心,每条绳子都是须要割断的,那就先割断最大值相应的那部分周围的绳子. #include <iostream> ...

  9. Codeforces 442C Artem and Array(stack+贪婪)

    题目连接:Codeforces 442C Artem and Array 题目大意:给出一个数组,每次删除一个数.删除一个数的得分为两边数的最小值,假设左右有一边不存在则算作0分. 问最大得分是多少. ...

随机推荐

  1. 用DotNetDetour HOOK .net类库

    https://github.com/bigbaldy1128/DotNetDetour ------------------------------------------------------- ...

  2. LeetCode.917-只反转字母(Reverse Only Letters)

    这是悦乐书的第353次更新,第378篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第215题(顺位题号是917).给定一个字符串S,返回"反向"字符串 ...

  3. Altera DDR2 IP核学习总结3-----------DDR2 IP核的使用

    根据上一篇生成的IP核,例化之后如上图,Local开头的数据是用户侧数据,其他数据暂时不用纠结,不用管. 这些是需要关注的信号,但是初学阶段很难对这些信号形成具体的概念,这里参考明德扬的代码进行二次封 ...

  4. C#静态调用带有SoapHeader验证的WebServices

    转自:http://blog.csdn.net/u012995964/article/details/54562111 本文记录带有SoapHeader验证的WebServices服务创建.部署及C# ...

  5. 100+ Python挑战性编程练习(1)

    目前,这个项目已经获得了7.1k  Stars,4.1k Forks. 初级水平是指刚刚通过Python入门课程的人.他可以用1或2个Python类或函数来解决一些问题.通常,答案可以直接在教科书中找 ...

  6. 使用自定义View

    1 关于自定义的View的构造函数 java中对构造函数只是调用,不继承.因为整个UI是android系统提供的框架,因此构造函数需要写成它要求的格式,即和View的构造函数一样. 自定义的View中 ...

  7. Java static基本认知

    一. static的用途 在Java编程思想中有这么一句话:“static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅 ...

  8. UVA 1642 MagicalGCD 题解

    题面 本题是一道区间最大公约数的模板题: 如果N^2暴力的话当然会超时,所以我们要发掘出区间gcd的特点: 设gcd[i]表示区间[1,i]的最大公约数: 我们可以发现,从一个点i到1之间的所有区间的 ...

  9. 洛谷 P3368 树状数组 题解

    题面 本题随便看两眼就知道该题满足了优美的查分性质: 对于在区间[x,y]内操作时,应该将查分数组的第x项和第y+1项进行相反操作: 询问答案时,问第i个数的值就是查分数组的前i项和: 暴力+玄学卡常 ...

  10. 工作中常用到的JS验证

    Common.js // JavaScript Document // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |) // O\ = ...