当前位置: 首页 > article >正文

2024/2/4 备战蓝桥杯 5-1 前缀和

目录

求和

0求和 - 蓝桥云课 (lanqiao.cn)

可获得的最小取值

0可获得的最小取值 - 蓝桥云课 (lanqiao.cn)

领地选择

P2004 领地选择 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)


求和

0求和 - 蓝桥云课 (lanqiao.cn)

思路:先对公式进行合并同类相,然后用前缀和

完整代码:

#include <bits/stdc++.h>
#define int long long
const int N = 2e6 + 10;
int a[N], sum[N];
int ans;
signed main() {
    int n;
    std::cin >> n;
    for (int i = 1; i <= n; i++) {
        std::cin >> a[i];
        sum[i] = a[i] + sum[i - 1];
    }
    for (int i = 1; i <= n; i++) {
        ans += a[i] * (sum[n] - sum[i]);
    }
    std::cout << ans;
    return 0;
}

可获得的最小取值

0可获得的最小取值 - 蓝桥云课 (lanqiao.cn)

思路:

第一个情况是取数组前面两个数,第二个情况是取数组末尾的一个元素,如果循环k次一一比较的话,那么{1,1,1,1,1,1,3},若k=3,最小值就是6,这个是贪心的思想,可是最小值应该是5(3+1+1)。

如果第一个情况做 p 次的话,第二个情况就做 k-p 次

此时的总和为

所以遍历一遍p的值 

完整代码:

#include <bits/stdc++.h>
#define int long long
const int N = 2e5+10;
int a[N],s[N];
signed main()
{
    int n,k;
    std::cin >> n >> k;
    for(int i = 1;i <= n;i ++)
    {
        std::cin >> a[i];
    }
    std::sort(a+1,a+1+n);
//    for(int i = 1;i <= n;i ++)
//    {
//        std::cout<<a[i]<<" ";
//    }
//    std::cout<<"\n";
    for(int i = 1;i <= n;i ++)
    {
        s[i]=s[i-1]+a[i];
    }
//    for(int i = 1;i <= n;i ++)
//    {
//        std::cout<<s[i]<<" ";
//    }
//    std::cout<<"\n";
    int ans=1e18;
    for(int i = 1;i <= k;i ++)
    {
        ans=std::min(ans,s[n]-s[n-(k-i)]+s[2*i]);
    }
    std::cout<<ans;
    return 0;
}

领地选择

P2004 领地选择 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:

这道题用暴力会超时,先用一个数组记录二维前缀和,再来遍历

二位前缀和

从原点开始:s[i,j]=s[i,j-1]+s[i-1,j]-s[i-1,j-1]+a[i,j]

(x1,y1),(x2,y2)中的所有数之和为

s[x2,y2]+s[x1-1,y1-1]-s[x1-1,y2]-s[x2,y1-1]

完整代码:

#include <bits/stdc++.h>
#define int long long
const int N = 1e3+10;
int a[N][N];
int sum[N][N];
signed main()
{
    int n,m,c;
    std::cin >> n >> m >> c;
    for(int i = 1;i <= n;i ++)
    {
        for(int j = 1;j <= m;j ++)
        {
            std::cin >> a[i][j];
            sum[i][j]=a[i][j]+sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1];
        }
    }
    int maxx=-1e18,maxy=-1e18,ans=-1e18;
    for(int i = 1;i <= n-c+1;i ++)
    {
        for(int j = 1;j <= m-c+1;j ++)
        {
            int x1=i,y1=j,x2=i+c-1,y2=j+c-1;
            int num=sum[x2][y2]+sum[x1-1][y1-1]-sum[x1-1][y2]-sum[x2][y1-1];
            if(num>ans)
            {
                ans=num;
                maxx=x1;
                maxy=y1;
            }
        }
    }
    std::cout<<maxx<<" "<<maxy;
    return 0;
}


http://www.kler.cn/a/227973.html

相关文章:

  • Day29(补)-【AI思考】-精准突围策略——从“时间贫困“到“效率自由“的逆袭方案
  • rust学习-rust中的保留字
  • 新年快乐!给大家带来了一份 python 烟花代码!
  • 设计模式面试题
  • 基于SpringBoot的高校一体化服务平台的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • 【C++】设计模式详解:单例模式
  • 什么是 Java 中的 IO 和 NIO?它们之间有什么区别?什么是 Java 中的内存管理和垃圾回收?常见的垃圾回收算法有哪些?
  • Redisson看门狗机制
  • ubuntu 18.04修改网卡名称
  • 论文阅读-在分布式数据库环境中对哈希算法进行负载均衡基准测试
  • 调试OpenHarmony应用/服务
  • gpt今日最新新闻:gpts的广泛应用
  • Mysql架构系列——生产常用的高可用部署模式介绍
  • 程序执行内存区域,堆栈使用及区别
  • 如何在 Microsoft Azure 上部署和管理 Elastic Stack
  • 开源软件的影响力
  • 【数据结构与算法】(5)基础数据结构之队列 链表实现、环形数组实现详细代码示例讲解
  • Leetcode 3027. Find the Number of Ways to Place People II
  • P8753 [蓝桥杯 2021 省 AB2] 小平方--2024蓝桥杯冲刺省一
  • 突破编程_C++_面试(基础知识(6))
  • 【HarmonyOS应用开发】HTTP数据请求(十四)
  • 蓝桥杯快读快写
  • wireshark分析数据包:追踪流
  • electron获取元素xpath、pc端网页展示获取到的xpath、websocket给两端传值
  • xmind思维导图 for mac v24.01中文版
  • Haas 开发板连接阿里云上传温湿度和电池电压