算法重新刷题

news2024/9/21 18:49:26

基础算法

前缀和

一维前缀和

[USACO16JAN] Subsequences Summing to Sevens S - 洛谷

这一题主要是需要结合数学知识来求解,

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 50010;

int n;
int s[N], l[7], r[7];

int main() {
    scanf("%d", &n);

    for (int i = 1; i <= n; i ++) {
        int cur;
        scanf("%d", &cur);
        // 初始化前缀和矩阵
        s[i] = (s[i - 1] + cur) % 7;
    }
    // 从右往左,记录7的每个余数的最左边的坐标值
    for (int i = n; i ; i --) l[s[i]] = i;
    // 从左往右,记录7的每个余数的最右边的坐标值
    for (int i = 1; i <= n; i ++) r[s[i]] = i;
    l[0] = 0;

    int res = 0;
    for (int i = 0; i <= 6; i ++) {
        if (r[i]) res = max(res, r[i] - l[i]);
    }

    printf("%d\n", res);

    return 0;
}

二维前缀和

核心的原理

模板题
活动 - AcWing

例题

最大正方形 - 洛谷

这个题的N是100,比较小,可以用三重循环通过;故枚举正方形的边长,记作len
这个题的(x1,y1)等于(i,j) 这个题的(x2,y2)相当于(i+len,j+len)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 510;
int  a[N][N],s[N][N];
int n,m;

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
			s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
		}
	}
	
	//判断正方形 这个正方形里面的和是变长的平方
	// 枚举最大长度
    int res = 0;
    for (int i = 1; i <= n; i ++){
        for (int j = 1; j <= m; j ++) {
            for (int len = 0; i + len <= n && j + len <= m; len ++) {
                if (s[i + len][j + len] - s[i - 1][j + len] - s[i + len][j - 1] + s[i - 1][j - 1] == (len + 1) * (len + 1)){
                    res = max(len + 1, res);
                }
            }
        }
    }           
	cout<<res<<endl;
	
	
	return 0;
}

二维前缀和之固定边长的正方形
[HNOI2003] 激光炸弹 - 洛谷

#include<iostream>
#include<algorithm>
using namespace std;
int n, m;
int s[5050][5050];
int res = 0;



int main()
{
	cin >> n >> m;
	while (n--)
	{
		int x, y, v;
		cin >> x >> y >> v;
		s[x + 1][y + 1] += v;
	}

	for (int i = 1; i <= 5001; i++)
	{
		for (int j = 1; j <= 5001; j++)
		{
			s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
		}
	}

	for (int i = m; i <= 5001; i++)
		for (int j = m; j <= 5001; j++)
		{
			//标准
			int value = s[i][j] - s[i - m][j] - s[i][j - m] + s[i - m][j - m];
			res = max(res, value);
		}
	printf("%d", res);

	return 0;
}

 

差分

一维差分

[Poetize6] IncDec Sequence - 洛谷

这个题里面的数学推理我现在都还没看明白

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
typedef long long ll;
ll a[N];
ll b[N];
ll n;
int main()
{
	cin>>n;
	for(ll i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	ll x,y;
	x=y=0;
	for(ll i=1;i<n;i++)
	{
		b[i]=a[i+1]-a[i];
		if(b[i]<0)x-=b[i];
		else y+=b[i];
	}
	cout<<max(x,y)<<endl;
	cout<<abs(x-y)+1<<endl;
	return 0;
}

二维差分

模板题

活动 - AcWing

#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1e3 + 10;
int a[N][N], b[N][N];
//差分矩阵为什么是这个
void insert(int x1,int y1,int x2,int y2,int c)
{
    b[x1][y1]+=c;
    b[x2+1][y1]-=c;
    b[x1][y2+1]-=c;
    b[x2+1][y2+1]+=c;
}
// void insert(int x1, int y1, int x2, int y2, int c)
// {
//     b[x1][y1] += c;
//     b[x2 + 1][y1] -= c;
//     b[x1][y2 + 1] -= c;
//     b[x2 + 1][y2 + 1] += c;
// }
int main()
{
    int n, m, q;
    cin >> n >> m >> q;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> a[i][j];
            
    //初始化差分数组
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            insert(i, j, i, j, a[i][j]);      //构建差分数组
        }
    }
    while (q--)
    {
        int x1, y1, x2, y2, c;
        cin >> x1 >> y1 >> x2 >> y2 >> c;
        insert(x1, y1, x2, y2, c);
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];  //二维前缀和
        }
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            printf("%d ", b[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 洛谷地毯 - 洛谷

在模版的基础上稍微变一下形即可
 

#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1e3 + 10;
int a[N][N], b[N][N];
//差分矩阵为什么是这个
void insert(int x1,int y1,int x2,int y2,int c)
{
    b[x1][y1]+=c;
    b[x2+1][y1]-=c;
    b[x1][y2+1]-=c;
    b[x2+1][y2+1]+=c;
}
// void insert(int x1, int y1, int x2, int y2, int c)
// {
//     b[x1][y1] += c;
//     b[x2 + 1][y1] -= c;
//     b[x1][y2 + 1] -= c;
//     b[x2 + 1][y2 + 1] += c;
// }
int main()
{
    int n, m, q;
    cin >> n >> m;
            
    //初始化差分数组
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            insert(i, j, i, j, 0);      //构建差分数组
        }
    }
    while (m--)
    {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        insert(x1, y1, x2, y2, 1);
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];  //二维前缀和
        }
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            printf("%d ", b[i][j]);
        }
        printf("\n");
    }
    return 0;
}

贪心 

与排序有关的贪心(注意排序的写法)

结构体排序(记忆一下)

[USACO1.3] 混合牛奶 Mixing Milk - 洛谷

bool cmp(cow farmer1,cow farmer2)
{
	return farmer1.p<farmer2.p;
}
也就是bool cmp(结构体名称 实例1,结构体名称 实例2)
{
    return 实例1的某个成员<实例2的某个成员;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
struct cow {
	int p;
	int maxnum;
}farmer[N];
bool cmp(cow farmer1,cow farmer2)
{
	return farmer1.p<farmer2.p;
}

int main()
{
	int m,n;
	int sum = 0;
	cin >> m>> n;
	for (int i = 0; i < n; i++)
	{
		cin >> farmer[i].p>>farmer[i].maxnum;
	}
	sort(farmer,farmer+n,cmp);
	
	//需要m牛奶
	int mark=0;
	while(farmer[mark].maxnum<m)
	{
		m-=farmer[mark].maxnum;
		sum+=farmer[mark].p*farmer[mark].maxnum;
		mark++;
	 } 
	 sum+=farmer[mark].p*m;
	 cout<<sum<<endl;
	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1907177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CANopen协议---PDO使用配置

1、CANopen知识回顾 在上一讲中&#xff0c;已经对CANopen的基本结构和整体内容进行了一番梳理&#xff0c;本笔记主要整理了一下CANopen如何配置PDO&#xff0c;实现数据周期性自动上传和控制信号快速发送等操作。 CANopen协议开发梳理总结笔记教程-CSDN博客文章浏览阅读920次…

uniapp父页面调用子页面 组件方法记录

文章目录 导文如何点击父页面&#xff0c;触发子页面函数先写一个子页面的基础内容父元素 如何点击父页面&#xff0c;修改子页面的值先写一个子页面的基础内容父元素 导文 如何点击父页面&#xff0c;触发子页面函数&#xff1f; 如何点击父页面&#xff0c;修改子页面的值&am…

LVGL移植与VS模拟器使用

一、移植文件介绍 二、移植部分 第一步&#xff1a;创建LVGL文件夹 第二步&#xff1a; 构造LVGL文件夹&#xff1a;LVGL - GUI - lvgl - 第三步&#xff1a;添加文件 3.1 从examples中添加2个.c文件 3.2 从src中添加文件 draw文件 extra文件 第四步&#xff1a; 三、Ke…

WordPress作品设计素材图片站资讯文章教程uigreat主题

主题介绍 uigreat主题是一款wordpress作品主题&#xff0c;发布设计作品素材文章&#xff0c;适合作品展示、设计等站点使用等&#xff0c;这款主题都非常合适。 1、自适应设计&#xff0c;PC、平板、手机等均可正常浏览&#xff1b; 2、图片缩略图可自定义高度&#xff0c;主…

2005-2023年各省居民人均消费支出、城镇居民人均消费支出、农村居民人均消费支出数据(无缺失)

2005-2023年各省居民人均消费支出、城镇居民人均消费支出、农村居民人均消费支出数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;2005-2023年 2、来源&#xff1a;国家统计局、统计年鉴 3、范围&#xff1a;31省 4、指标&#xff1a;全体居民人均消费支出、城镇居…

相位噪声为什么越低越好?

什么是相位噪声&#xff1f; 相位噪声是描述无线电波信号的一种重要参数&#xff0c;它指的是在各种噪声的作用下&#xff0c;系统输出信号相位的随机变化。具体来说&#xff0c;相位噪声可以类比为由于天气原因导致的航班延误&#xff0c;使得航班的起飞和降落时间相对于正常…

废品回收小程序开发,让回收更加便捷

当下随着大众环保意识的提高&#xff0c;废品回收市场得到了快速发展&#xff0c;拥有着巨大的发展空间。在互联网科技的支持下&#xff0c;废品回收行业也迎来了新的发展机遇&#xff0c;从传统的回收模式到线上回收转型&#xff0c;通过数字化发展&#xff0c;为居民带来便利…

智慧党建管理系统源码 党建智能管理系统搭建 含完整带代码包和图文搭建教程

随着信息技术的飞速发展&#xff0c;智慧党建成为新时代党建工作的重要趋势。智慧党建管理系统作为党建信息化的重要载体&#xff0c;不仅提升了党建工作的效率&#xff0c;还增强了党组织的凝聚力和战斗力。分享一个智慧党建管理系统源码&#xff0c;轻松搭建党建智能管理系统…

双链表(数组模拟)

双链表&#xff08;数组模拟&#xff09; 什么是双链表数组模拟双链表题目 什么是双链表 双链表不同于单链表的是 每一个节点不但存储了下一个节点的位置&#xff0c;也存储了上一个节点的位置。 数组模拟双链表 所以如果用数组的话&#xff0c;就需要创建三个数组。 题目 …

【Linux】文件内容查看命令——cat,tac,more,less,head,tail,od

如果我们要查看一个文件的内容时&#xff0c;该如何是好&#xff1f; 这里有相当多有趣的命令可以来分享一下&#xff1a;最常使用的显示文件内容的命令可以说是cat与more及less了。 此外&#xff0c;如果我们要查看一个很大的文件&#xff08;好几百MB时)&#xff0c;但是我们…

数据合并 26-30题(30 天 Pandas 挑战)

数据合并 1. 知识点1.27 左连接1.28 数据填充与交叉连接1.29 获取列值列表 题目2.26 合作过至少三次的演员和导演2.27 使用唯一标识码替换员工ID2.28 学生们参加各科测试的次数2.29 至少有5名直接下属的经理2.30 销售员 1. 知识点 1.27 左连接 datapd.merge(employees,employ…

2024图纸加密软件TOP8排行丨企业保护数据安全最佳选择

图纸往往包含了设计人员的创意和智慧&#xff0c;是企业的重要资产。加密可以防止未经授权的复制、分发或使用&#xff0c;保护设计的原创性和独特性不被侵犯。 许多图纸可能含有公司的商业秘密&#xff0c;比如特定的技术参数、生产流程或是产品设计等。这些信息若泄露给竞争…

美国Facebook直播网络卡顿问题怎么解决?

美国Facebook直播为用户提供了与当地客户、粉丝实时互动的机会&#xff0c;然而&#xff0c;有时由于网络问题&#xff0c;直播可能会出现卡顿现象&#xff0c;影响用户体验。本文将介绍解决美国Facebook直播网络卡顿问题的一种可能解决方案——接入海外直播网络专线。 了解美国…

国内知名源码交易平台及其特点,建议收藏!

​在数字化时代&#xff0c;源码交易平台成为连接开发者与项目需求的重要桥梁。这些平台不仅提供了丰富的源码资源&#xff0c;还促进了技术交流与合作。本文小编将分享介绍几个国内知名的源码交易平台&#xff0c;包括帮企商城、春哥技术博客、86资源网、春哥技术源码论坛以及…

如何选择高性价比的土壤检测仪器?

在现代农业与环保领域&#xff0c;土壤检测仪器的选择显得尤为关键。它不仅关系到土壤养分管理、作物健康生长&#xff0c;还涉及到环境保护和可持续发展。那么&#xff0c;面对市场上琳琅满目的土壤检测仪器&#xff0c;我们该如何选择一款实用的设备呢&#xff1f; 首先&…

智慧安防/智慧工厂/视频分析EasyCVR视频监控汇聚平台如何关闭国标设备的自动检索功能?

安防监控视频融合汇聚平台EasyCVR兼容性强&#xff0c;可支持Windows系统、Linux系统以及国产化操作系统等&#xff0c;平台既具备传统安防视频监控的能力&#xff0c;也具备接入AI智能分析的能力&#xff0c;可拓展性强、视频能力灵活&#xff0c;能对外分发RTMP、RTSP、HTTP-…

用R在地图上绘制网络图的三种方法

地理网络图与传统的网络图不同&#xff0c;当引用地理位置进行节点网络可视化时&#xff0c;需要将这些节点放置在地图上&#xff0c;然后绘制他们之间的连结。Markus konrad的帖子(https://datascience.blog.wzb.eu/2018/05/31/three-ways-of-visualizing-a-graph-on-a-map/)&…

绝地求生PUBG兰博基尼怎么兑换 兰博基尼怎么获得

绝地求生采用虚幻4引擎制作&#xff0c;玩家们会在一个偏远的岛屿上出生&#xff0c;然后展开一场赢家通吃的生存竞赛&#xff0c;最后只会有1个人存活。当然&#xff0c;和其他生存游戏一样&#xff0c;玩家需要在广袤复杂的地图中收集武器、车辆、物资&#xff0c;而且也会有…

数字化设计与分析助力建造印度最大污水处理厂

利用 STAAD 开展结构分析和设计&#xff0c;为不稳定土体上的复杂水池系统开发稳定的基础 治理河流 新德里不仅是印度的首都&#xff0c;一个多世纪以来也一直是印度最重要的城市之一。这座城市于 1911 年作为新的政府所在地&#xff0c;历经 20 年时间建成了许多宏伟建筑&…

tomcat的优化和tomcat和nginx实现动静分离:

tomcat的优化 tomcat自身的优化 tomcat的并发处理能力不强。大项目不使用tomcat做为转发动态的中间件&#xff08;k8s集群&#xff0c;python&#xff0c;rubby&#xff09;&#xff0c;小项目会使用&#xff08;内部使用&#xff09;&#xff0c;动静分离。 优化tomcat的启动…