2020.7.17 T2数组(jz暑假训练day3)

Description 在这里插入图片描述

Input

在这里插入图片描述

Output

在这里插入图片描述

Sample Input

输入样例1:
3 2 7
5 4 2

输入样例2:
5 3 1
5 4 3 5 5

Sample Output

输出样例1:
999999732

输出样例2:
0

Data Constraint

在这里插入图片描述

赛时

本来dp搞30分,之后搞特殊,结果包蛋。

正解

这一题先将所有的数取绝对值,并用bj标记出正负性。
(1)当输出答案是非负数时,将能变号的数变号,并转到情况(2)。若不能将任何数改变符号,则要将数组中最小的数减去k*x。
(2)当输出答案是负数时,要用一个小根堆堆维护最小值,并将当前最小值+x。
最后输出所有数相乘再乘bj
没什么好说的吧?

#include<cstdio>
#include<iostream>
#include<queue>
#include<cmath>
#define mod 1000000007
using namespace std;
int n,k,x,bz,a[200010],min1;
long long minn=0x3f3f3f3f;
priority_queue<int,vector<int>,greater<int> > Q;
int main(){
	scanf("%d%d%d",&n,&k,&x);
	for(int i=1;i<=n;i++){
		int s;
		scanf("%d",&s);
		a[i]=abs(s);
		if(s<0) bz++;
		if(a[i]<minn) minn=a[i],min1=i;
	}
	bz%=2;
	if(bz==0){
		if(a[min1]<(long long)x*k){
			int num=a[min1]/x+1;
			a[min1]-=num*x;
			a[min1]=abs(a[min1]);
			bz=1;
			k-=num;
		}else{
			a[min1]-=x*k;
			long long ans=1;
			for(int i=1;i<=n;i++){
				ans*=a[i];
				ans%=mod;
			}
			printf("%lld",ans);
		}
	}
	if(bz==1){
		for(int i=1;i<=n;i++)
			Q.push(a[i]);
		while(k--){
			int t=Q.top();
			Q.pop();
			t+=x;
			Q.push(t);
		}
		long long ans=1;
		for(int i=1;i<=n;i++){
			int x=Q.top();
			Q.pop();
			ans=(ans*x)%mod;
		}
		printf("%lld",ans*(-1)+mod);
	}
}

写的十分的丑,就凑合的看吧。

猜你喜欢

转载自blog.csdn.net/jay_zai/article/details/107416400