Maxim and Array CodeForces - 721D (贪心)

大意: 给定序列, 每次操作选择一个数+x或-x, 最多k次操作, 求操作后所有元素积的最小值

贪心先选出绝对值最小的调整为负数, 再不断选出绝对值最小的增大它的绝对值

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#include <bitset>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl ‘\n‘
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
//head

#ifdef ONLINE_JUDGE
const int N = 1e6+10;
#else
const int N = 111;
#endif

int n, k, x;
struct _ {
	ll w;
	int id;
	bool operator < (const _ &rhs) const {
		return abs(w) > abs(rhs.w);
	}
} e[N];
ll ans[N];
int sgn(ll x) {return x<0?-1:1;}
int main() {
	scanf("%d%d%d", &n, &k, &x);
	int f = 0;
	REP(i,1,n) scanf("%lld", &e[i].w), e[i].id=i, f^=e[i].w<0;
	if (!f) {
		_ *r = max_element(e+1,e+1+n);
		if (!r->w) --k,r->w-=x;
		else {
			int ff = sgn(r->w);
			while (k) {
				r->w -= sgn(r->w)*x, --k;
				if (sgn(r->w)!=ff) break;
			}
		}
	}
	priority_queue<_> q;
	REP(i,1,n) q.push(e[i]);
	while (k) {
		_ t = q.top(); q.pop();
		t.w += sgn(t.w)*x;
		q.push(t), --k;
	}
	while (q.size()) ans[q.top().id]=q.top().w,q.pop();
	REP(i,1,n) printf("%lld ", ans[i]);hr;
}

原文地址:https://www.cnblogs.com/uid001/p/10597307.html

时间: 2024-11-09 14:16:49

Maxim and Array CodeForces - 721D (贪心)的相关文章

Codeforces 721D [贪心]

/* 不要低头,不要放弃,不要气馁,不要慌张. 题意: 给一列数a,可以进行k次操作,每次操作可以选取任意一个数加x或者减x,x是固定的数.求如何才能使得这个数列所有数乘积最小. 思路: 贪心...讨论这列数中负数的个数,如果为偶数,那么把数列中绝对值最小的数使其往0的方向前进. 如果为奇数,同样选择绝对值最小的数,使其往背离0的方向前进. 道理很简单...自己写写就看出来了... wa点: 有一个细节没处理好,如果经过某次操作某个数变成0了...那么我们的负数记录并没有更新... 默认下一次会

Artem and Array CodeForces - 442C (贪心)

大意: 给定序列$a$, 每次任选$a_i$删除, 得分$min(a_{i-1},a_{i+1})$(无前驱后继时不得分), 求最大得分. 若一个数$x$的两边都比$x$大直接将$x$删除, 最后剩余一个先增后减的序列, 然后按从大到小顺序删除 #include <iostream> #include <algorithm> #include <math.h> #include <cstdio> #include <vector> #includ

Codeforces 437D 贪心+并查集

这个题目让我想起了上次在湘潭赛的那道跪死了的题.也是最值问题,这个也是,有n个动物园 每个都有权值 然后被m条路径相连接,保证图是连通的,然后求所有的p[i][j]之和.i,j为任意两个zoo,pij就为i到j路上遇到的包括i j在内的最小权值的zoo 然后我就焦头烂额了一下,这个明显就是看某个最小值为最后的结果发挥了多少次作用,但这个是图,要知道某个节点到底给多少条路径贡献出了最小值,还真是有点没头绪(在已知的复杂度一看 最多只能用nlogn的),最后是看了解答才知道的 用并查集来解决某个最小

CodeForces 721D Maxim and Array

贪心,优先队列. 先看一下输入的数组乘积是正的还是负的. ①如果是负的,也就是接下来的操作肯定是让正的加大,负的减小.每次寻找一个绝对值最小的数操作就可以了. ②如果是正的,也是考虑绝对值,先操作绝对值最小的那个数,直到那个数字的符号发生变化就停止操作,接下来就是第①步. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #incl

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

题解: 模拟题 虽然是个大模拟题,但是很考验思维的活跃度. 刚开始做的时候知道怎么做.但是自己的想法情况很多.分类枚举总是把自己混淆 这题教会我的是,要仔细思考分类的方式 这个题.根据枚举负数的个数奇偶来判断 为奇数:那么绝对值最小的数,如果是正,+x,是负,-x; 为偶数:那么使得绝对值最小的数.改变符号,如果正-x,负+x. 代码: #include<bits/stdc++.h> #define maxn 200010 #define mod 1000000007 #define ll l

URAL 2000. Grand Theft Array V(贪心啊)

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=2000 2000. Grand Theft Array V Time limit: 0.5 second Memory limit: 64 MB A long anticipated game called Grand Theft Array V is about to appear in shops! What, haven't you heard of it? Then we must te

Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem D (Codeforces 831D) - 贪心 - 二分答案

There are n people and k keys on a straight line. Every person wants to get to the office which is located on the line as well. To do that, he needs to reach some point with a key, take the key and then go to the office. Once a key is taken by somebo

CCPC2018 桂林 A: Array Merge(贪心、带权并查集合并)

时间限制: 1 Sec  内存限制: 128 MB提交: 37  解决: 3[提交] [状态] [命题人:admin] 题目描述 Given two arrays A, B of length n and m separately, you have to merge them into only one array C (of length n + m) obeying the rule that the relative order of numbers in the same origin

Maxim and Array

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