备战蓝桥杯---贪心刷题2

话不多说,直接看题:

首先我们大致分析一下,先排序一下,K==n,那就全部选。

当k<n时,k是偶数,那么结果一定非负,因为假如负数的个数有偶数个,那么我们成对选它,假如是奇数个,我们就把某一个负数选出,再成对选即可。

若k是奇数,那么所有数均负,那么答案《0,如果至少存在一个非负数,那我们先选一个非负数,然后问题就转化成了上一个形式。

因此我们排一下序,假如k是偶的,那么我们从两端成对的选,k是奇数,那么一定先选正的(若选负的那么后面也是选奇数个,这样就没有区别了),接下来就是刚才的问题了。

下面是AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=100010,mod=1e9+9;
typedef long long LL;
int n,k;
int a[N];
int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    sort(a,a+n);
    int res=1;
    int l=0,r=n-1;
    int sign=1;

    if(k%2){
        res=a[r--];
        k--;
        if(res<0) sign=-1;
    }
    while(k){
        LL x=(LL)a[l]*a[l+1],y=(LL)a[r-1]*a[r];
        if(x*sign>y*sign){
            res=x%mod*res%mod;
            l+=2;
        }
        else{
            res=y%mod*res%mod;
            r-=2;
        }
        k-=2;
    }
    cout<<res;
}

接题:

首先,后缀表达式也可以实现括号操作,首先假如没有负号,那么都是直接相加。

同时我们可以把减号从M变成1(1-(a-b-c---)),最多有N+M个减号。

因此我们减一个最小值,同时必须加最大值(第一个一定是正的),其他加绝对即可。

下面是AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=200010;
int n,a[N],m;
int main(){
    cin>>n>>m;
    int k=n+m+1;
    for(int i=0;i<k;i++) scanf("%d",&a[i]);
    
    if(m==0){
        LL res=0;
        for(int i=0;i<k;i++) res+=a[i];
        cout<<res;
        return 0;
    }
    sort(a,a+k);
    LL res=a[k-1]-a[0];
    for(int i=1;i<k-1;i++) res+=abs(a[i]);
    cout<<res;
}

接题:

我们不妨看看前缀和,我们会惊奇的发现,我们每一次操作相当于交换一下他和它前面的前缀和,因此问题就转化成了求最大前缀和差值的min,并且两端是固定的,中间一段可以任意交换。

那么怎么求?我们不妨假设a0<an,同时确定其中的max与min。

此时,我们把图像向y轴投影压缩成一条线段,然后排一下序得到:

那么怎么走最优?

显然我们从S0开始向左两点走一步,即跨一个点走一步是最优的。

下面是AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=300010;
LL a[N],s[N];
bool st[N];
int n;
int main(){
    int t;
    cin>>t;
    while(t--){
        scanf("%d",&n);
        s[0]=0;
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            s[i]=s[i-1]+a[i];
        }
        LL s0=s[0],sn=s[n];
        if(s0>sn) swap(s0,sn);
        sort(s,s+n+1);//注意起点在0上
        for(int i=0;i<=n;i++){
            if(s[i]==s0){
                s0=i;
                break;
            }
        }
        for(int i=0;i<=n;i++){
            if(s[i]==sn){
                sn=i;
                break;
            }
        }
        memset(st,0,sizeof(st));
        int l=0,r=n;
        for(int i=s0;i>=0;i-=2){
            a[l++]=s[i];
            st[i]=1;
        }
        for(int i=sn;i<=n;i+=2){
            a[r--]=s[i];
            st[i]=1;
        }
        for(int i=0;i<=n;i++){
            if(st[i]==0) a[l++]=s[i];
        }
        LL res=0;
        for(int i=1;i<=n;i++){
            res=max(res,abs(a[i]-a[i-1]));
        }
        cout<<res<<endl;
    }
}
相关推荐
shirsl31 分钟前
算法 Day 2 滑动窗口 + 栈 / 单调栈
开发语言·python·算法
土司大王1 小时前
LeetCode hot100 回溯专题总结:Java 通用模板、决策树模型
java·算法·leetcode·决策树
2601_962218612 小时前
万象生鲜系统订单全生命周期状态同步技术实现业务可视
大数据·数据库·人工智能·python·算法
那年窗外下的雪.2 小时前
AIDC 学习日志|第 22 天|All-Active/Single-Active 故障演练设计
服务器·网络·学习·算法·哈希算法
wzdark3 小时前
基于启发式搜索的最优路径规划算法研究4
算法
l1t3 小时前
用superpi、tinypi、tpi等工具计算圆周率的比较
c语言·算法
小智老师PMP3 小时前
2026PMP第八版新纲深度解读|从流程管控到价值交付,核心考点全迭代
人工智能·职场和发展·软件工程·制造·敏捷流程
a187927218313 小时前
【算法】链表(二):链表上的双指针——变速、异链与定距,和一份路程账本
数据结构·算法·leetcode·链表·go·指针·环形链表
2601_958352904 小时前
还要写 AEC 算法?0 代码 + 6 个引脚,F-18 让通话清晰度提升 300%
人工智能·算法·降噪消回音
happyprince4 小时前
03-regmix-深刻观-哲学与升华
算法