模拟----乘积最大

乘积最大

题目

给定N个整数A1, A2, … AN。请你从中选出K个数,使其乘积最大。
####请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数。

####注意,如果X<0, 我们定义X除以1000000009的余数是负(-X)除以1000000009的余数。
####即:0-((0-x) % 1000000009)

【输入格式】
第一行包含两个整数N和K。
以下N行每行一个整数Ai。

对于40%的数据,1 <= K <= N <= 100
对于60%的数据,1 <= K <= 1000
对于100%的数据,1 <= K <= N <= 100000 -100000 <= Ai <= 100000

【输出格式】
一个整数,表示答案。

【输入样例】
5 3
-100000
-10000
2
100000
10000

【输出样例】
999100009

解答

#include<stdio.h>
#include<list>
#include<vector>
#include<iostream>
#include<math.h>

using namespace std;
typedef list<int> LIST; 
typedef vector<int> VECTOR;

int main(){
	LIST::iterator i;
	LIST io;
	short hzb=0,hfb=0;
	long long  Iz=-1,If=-1,hz=0,hf=0;
	VECTOR num;
	int n,k,x,K;
	long long answer;
	io.clear();
	scanf("%d %d",&n,&k);
	K=k;
	while(n--){
		scanf("%d",&x);
    	for(i=io.begin();i!=io.end();i++){
	    	if(fabs(*i)<=fabs(x)) break;
    	}
    	io.insert(i,x);	
	}
	
	/*for(i=io.begin();i!=io.end();i++) cout<<*i<<" ";
	cout<<"\n";*/
	
	for(i=io.begin();i!=io.end();i++){
		if(k){
			num.push_back(*i);
			if(*i>0) Iz=num.size()-1; 
			if(*i<0) If=num.size()-1;
			k--;
		}
		else{
			if(hzb&&hfb) break;
			if(*i>=0&&!hzb){
				hz=*i;
				hzb=1;
			}
			if(*i<0&&!hfb){
				hf=*i;
				hfb=1;
			}
		}
	}
	answer=1;
//	printf("%d %d %lld %lld\n",num[Iz],num[If],hz,hf);
	if((Iz!=-1&&If!=-1)){
		for(int y=0;y<num.size();y++){
			if(y==Iz||y==If) continue;
	    	answer=(answer*num[y])%1000000009;
    	}
    	if(answer>0&&(hz!=0||hf!=0)){
	    	if(hz*num[Iz]>=hf*num[If]) answer=((answer*hz)%1000000009)*num[Iz]%1000000009;
        	else answer=((answer*hf)%1000000009)*num[If]%1000000009;
    	}
    	else answer=((answer*num[Iz])%1000000009*num[If])%1000000009;
	}
	else if(If==-1){
		for(int y=0;y<num.size();y++)	answer=(answer*num[y])%1000000009;
	}
	else if(Iz=-1){
		if(hz!=0){
			for(int y=0;y<num.size();y++){
		    	if(y==If) continue;
	        	answer=(answer*num[y])%1000000009;
    	    }
    	    answer=(answer*hz)%1000000009;
		}
		else if(K%2==0){
			for(int y=0;y<num.size();y++) answer=(answer*num[y])%1000000009;
		}
		else {
			i=io.end();
			i--;
			while(K--){
			    answer=(answer**i)%1000000009;
			    i--;
			}
		}
    }
	else answer=0;
	printf("%lld",answer);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值