代码改变世界

蓝桥杯[省赛][B组]-乘积最大

2022-04-05 22:37  幻霞  阅读(55)  评论(0编辑  收藏  举报

题目来自蓝桥杯练习系统

 

这一题存在一个组合C(k,n),选择的就是组合中的其中一个,如果一个条件一个条件的考虑的话非常麻烦,比赛时也会浪费大量时间,实在想不出思路的话可以去暴力拿一些分

#include<bits/stdc++.h>
#include<map>
#include<queue>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int n,k;
int num[100005];
queue<int> z;
queue<int> f;
int main() {
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n>>k;
    for(int i=0; i<n; i++) {
        cin>>num[i];
    }
    sort(num,num+n);
    long long maxAns=LLONG_MIN;
    long long cur;
    while(next_permutation(num,num+n)) {
        cur=1;
        for(int i=0; i<k; i++) {
            cur*=num[i];
        }
        maxAns=max(maxAns,cur);

    }
    cout<<(maxAns>0?maxAns%1000000009:-(-maxAns%1000000009));
    return 0;
}

升序排序,然后运用algorithm库中的next_permutation函数去获得下一个全排列,每次得到前k个再累乘,就可以拿到40分(思考一下怎么剪枝也许可以拿更多分)

这40分几乎是一半了,而且是毫无疑问能拿到的,如果时间不够充沛可以这样骗一波分,总比没有好。

当然,想要更多的分还是必须去思考如何求解的。

这里笔者去认真学习了一番:https://blog.csdn.net/weixin_52797843/article/details/122371558?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default&utm_relevant_index=12

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010, mod = 1000000009;
int n, k;
int a[N];
int main() {
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n>>k;
    for(int i=0; i<n; i++) cin>>a[i];
    sort(a,a+n);
    int res=1;
    int l=0,r=n-1;//左右下标
    int sign=1;
    if(k%2) { //如果k是奇数,先把奇数转化为偶数
//    这边res取得是最大值,一般是正数(通常情况下最大值一定要取) 
        res=a[r--];
        k--;
//        如果res小于0,就说明全是负数,这个时候颠倒判断符号取最大值(如果是奇数又全为负数必然结果是负数) 
        if(res<0) sign=-1;
    }
    //k是偶数,每次从左选两个,从右选两个,比较大小
    while(k) {
        LL x=(LL)a[l]*a[l+1],y=(LL)a[r-1]*a[r];
//        如果k原本就是偶数 
        if(x*sign>y*sign) {
            res=x%mod*res%mod;
            l+=2;
        } else {
            res=y%mod*res%mod;
            r-=2;
        }
        k-=2;
    }
    cout<<res;
    return 0;
}