秒懂算法2

视频链接 : 

希望下次秒懂的是算法题_哔哩哔哩_bilibili 

P1094 [NOIP2007 普及组] 纪念品分组

原题链接 : 

[NOIP2007 普及组] 纪念品分组 - 洛谷

 思路 :

  1. 排序 + 贪心 + 双指针
  2. 首先先对输入进来的数组进行排序(由小到大)
  3. 运用贪心的思想 : 前后结合,令l=1,r=n,若a[l]+a[r]<=w,那么a[l],a[r]可以成一组,l++,r--,ans++,否则a[r]单独成一组,r--,ans++;(这个求解过程用到双指针的思想);
  4. 该贪心思路在做题的时候想可能是对的,但是没有细究,具体的思想请参考 : 题解 P1094 【纪念品分组】 - heidoudou 的博客 - 洛谷博客

代码 : 

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){ return b==0 ? a : gcd(b,a%b); }
LL lcm(LL a,LL b){ return a / gcd(a,b) * b ; }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 3e4+10,mod = 1e9+7;
int n,w,a[N];
LL ans;inline void solve(){cin>>w>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);int l=1,r=n;while(l<=r){if(a[l]+a[r]<=w){l++; r--; ans ++;}else {r--; ans ++;}}cout<<ans <<endl;
}int main()
{IOSint _;// cin >> _;_ = 1; while(_ --) solve();return 0;
}

 P1102 A-B 数对

原题链接 : 

https://www.luogu.com.cn/problem/P1102

思路 : 

1.直接暴力,当然会tle了,hh( O(n^2) )

2.妙用map;(O(n))

3.用二分函数,upper_bound和lower_bound;对于a[i](a),其后满足 b-a=c的连续区间长度可以用二分函数来求得(当然是对于排好序的数组) O(nlogn)

详细解答请看代码 : 

代码 : 

代码(暴力) : 

 直接暴力,当然会收获tle(3个),hhh 
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){ return b==0 ? a : gcd(b,a%b); }
LL lcm(LL a,LL b){ return a / gcd(a,b) * b ; }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 2e5+10,mod = 1e9+7;
LL n,c,a[N];
LL ans;inline void solve(){cin>>n>>c;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if( (LL)(abs(a[i]-a[j])) == c )ans ++;}}cout << ans << endl;
}int main()
{IOSint _;// cin >> _;_ = 1; while(_ --) solve();return 0;
}

代码(用map) : 

// map
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){ return b==0 ? a : gcd(b,a%b); }
LL lcm(LL a,LL b){ return a / gcd(a,b) * b ; }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 2e5+10,mod = 1e9+7;
LL n,c,a[N];
LL ans;
map<LL,LL> mp;inline void solve(){cin>>n>>c;for(int i=1;i<=n;i++) cin>>a[i],mp[a[i]]++;for(int i=1;i<=n;i++) ans += mp[a[i]-c];cout << ans << endl;
}int main()
{IOSint _;// cin >> _;_ = 1; while(_ --) solve();return 0;
}

代码 : (二分) : 

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){ return b==0 ? a : gcd(b,a%b); }
LL lcm(LL a,LL b){ return a / gcd(a,b) * b ; }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 2e5+10,mod = 1e9+7;
LL n,c,a[N];
LL ans;inline void solve(){cin>>n>>c;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+n+1);for(int i=1;i<=n;i++){ans += ((upper_bound(a+1,a+n+1,a[i]+c)-a)-(lower_bound(a+1,a+n+1,a[i]+c)-a));}cout << ans << endl;
}int main()
{IOSint _;// cin >> _;_ = 1; while(_ --) solve();return 0;
}

P1105 平台

原题链接 : 

平台 - 洛谷

思路 : 

结构体排序 + 暴力,其实不难,要注意细节;

不然,就像这样(aaa) : 

 

第一次排序规则 : 高度优先,编号其次,由小到大;

第二次排序规则 : 编号优先,由小到大;

注意 : 

  1. 边界相同,落到下一个上面,注意结构体排序的规则!!!

代码 : 

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){ return b==0 ? a : gcd(b,a%b); }
LL lcm(LL a,LL b){ return a / gcd(a,b) * b ; }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 1e4+10;
int n,xl,xr;
struct Node{int idx,h,l,r,yl,yr;bool operator < (const Node &u) const{return h == u.h ? idx > u.idx : h < u.h;}
}a[N];bool cmp(const Node& x,const Node& y){return x.idx < y.idx;
}inline void solve(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i].h>>a[i].l>>a[i].r;a[i].idx = i;}sort(a+1,a+n+1);for(int i=1;i<=n;i++){xl=0,xr=0;for(int j=i-1;j>=1;j--){if(a[j].l<a[i].l && a[j].r>a[i].l && a[j].h < a[i].h){xl = a[j].idx;break;}}for(int j=i-1;j>=1;--j){if(a[j].r>a[i].r && a[j].l<a[i].r && a[j].h < a[i].h){xr = a[j].idx;break;}}a[i].yl = xl;a[i].yr = xr;}sort(a+1,a+n+1,cmp);for(int i=1;i<=n;i++){cout << a[i].yl << " " << a[i].yr << endl;}
}int main()
{IOSint _;// cin >> _;_ = 1; while(_ --) solve();return 0;
}

EK的代码中是用的一个pair<int,int>来存yl,yr信息,思想是一样!!!

P1111 修复公路

原题链接 : 

修复公路 - 洛谷

思路 : 

并查集

代码(cv!):

#include<bits/stdc++.h>
using namespace std;
int fa[1000+10],n,m;
struct node
{int x,y,t;
}a[100000+10];//结构体大法好!
bool cmp(node fir,node sec)
{return fir.t<sec.t;
}//按照时间排序
int gf(int x)
{if(fa[x]==x) return x;return fa[x]=gf(fa[x]);//这句是路径压缩,前面的题解已经说过,此处不再阐述
}
void hb(int x,int y)
{int fx=gf(x);//找到x的祖先int fy=gf(y);//找到y的祖先fa[fx]=fy;//让fx认fy为祖先
}//合并操作
bool check()
{int sum=0;for(int i=1;i<=n;i++){if(fa[i]==i) sum++;//统计独立集合的个数if(sum==2) return 0;//发现有两个就返回false应该会省一点时间}return 1;//只有1个集合,返回true
}//判断集合个数
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) fa[i]=i;//初始化for(int i=1;i<=m;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].t);sort(a+1,a+m+1,cmp);//按时间排序for(int i=1;i<=m;i++){hb(a[i].x,a[i].y);//进行合并if(check())//如果只有1个集合{printf("%d\n",a[i].t);//输出时间return 0;//愉快的结束主程序}}printf("-1\n");//所有公路修完了仍没有联通(集合个数>=2),输出-1return 0;//愉快的结束主程序
}

P1115 最大子段和

原题链接 : 

最大子段和 - 洛谷

思路 : 

贪心,由前向后遍历,sum记录和,如果sum<0的话,sum=0(不然的话,只会对后面的sum产生负影响),循环更新ans = max(ans,sum);

代码 : 

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;
typedef long long LL;
int gcd(int a,int b){ return b==0 ? a : gcd(b,a%b); }
int lcm(int a,int b){ if(a==0||b==0) return 0; return (a*b)/gcd(a,b); }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 2e5+10;
int n,x;
LL sum=0,ans = -1e9;inline void solve(){cin>>n;for(int i=1;i<=n;i++){cin>>x;sum += x;ans = max(ans,sum);if(sum < 0)	sum = 0;}cout << ans << endl;
}int main()
{IOSint _;// cin >> _;_ = 1; while(_ --) solve();return 0;
}

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

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

相关文章

arm版Linux下安装es集群

背景&#xff1a;由于生产上网络没通&#xff0c;没办法&#xff0c;只能自己安装一个es集群的测试环境了&#xff0c;我的电脑是Mac M2&#xff0c;安装的Linux是centos7&#xff0c;也是arm版的。 第一步&#xff1a;查看自己Linux系统的版本 命令&#xff1a;uname -a 例如…

设置微软Edge浏览器主页和新标签页,摆脱扰人和分散注意力的主页

默认情况下&#xff0c;Microsoft Edge会向您显示世界上最令人分心和讨厌的主页&#xff08;也称为主屏幕&#xff09;。微软不想只向你展示一个搜索框&#xff0c;也许还有一个漂亮的背景或一些你喜欢的网站的快捷方式&#xff0c;而是想在你面前扔一堆新闻标题和广告。 你可…

Linux 终端命令行 产品介绍

Linux命令手册内置570多个Linux 命令&#xff0c;内容包含 Linux 命令手册。 【软件功能】&#xff1a; 文件传输 bye、ftp、ftpcount、ftpshut、ftpwho、ncftp、tftp、uucico、uucp、uupick、uuto、scp备份压缩 ar、bunzip2、bzip2、bzip2recover、compress、cpio、dump、gun…

全新抖音快手小红书去水印系统网站源码 | 支持几十种平台

全新抖音快手小红书去水印系统网站源码 | 支持几十种平台

微信小程序左上角home图标的解决方法之一 层级混乱导致的home图标显示的问题 自定义左上角左侧图标的返回路径

这个项目的编辑页在tabbar上 导致跳到tabbar得使用wx.switchTab 保存后返回原来的页面就出现了左上角的home图标 本来想通过自定义home图标的跳转路径来解决这个问题 没想到居然找不到相关内容 有清楚的朋友麻烦给我留个言不胜感激 那我写一下我的骚操作 app.js globalData: {…

idea2023远程调试

使用idea2023版远程调试springboot 1.添加remote jvm debug 2.填写远程ip, 选择要调试项目 3.将 参数附带到需要远程调试的jar 命令之前, 重启即可, 命令一定要在jar包之前 , -agentlib:jdwptransportdt_socket,servery,suspendn,address5005即 java -agentlib:jdwptranspor…

我们的第一个 Qt 窗口程序

Qt 入门实战教程&#xff08;目录&#xff09; Windows Qt 5.12.10下载与安装 为何使用Qt Creator开发QT 本文介绍用Qt自带的集成开发工具Qt Creator创建Qt默认的窗口程序。 本文不需要你另外安装Visual Studio 2022这样的集成开发环境&#xff0c;也不需要你再在Visual St…

PDF可以修改内容吗?有什么注意的事项?

PDF是一种跨平台的电子文档格式&#xff0c;可以在各种设备上轻松阅读和共享。许多人喜欢将文档转换为PDF格式以确保格式的一致性和易读性。但是&#xff0c;PDF文件一般被认为是“只读”文件&#xff0c;即无法编辑。那么&#xff0c;PDF文件是否可以修改呢&#xff1f; 答案是…

vxe-table中树形结构

如图&#xff0c;同事让帮忙实现一个需求 从二级树节点开始&#xff0c;同时选中的只能有一个二级树节点&#xff0c;选中的二级树节点之下的子节点都可以被选中。否则不能被选中 直接上代码 需要注意的是&#xff0c;文中树状图传递的数据是打平的数据&#xff0c;设置代码是…

elementui tree 层级过多时,高亮状态无法选满整行

问题&#xff1a; 如上图所示&#xff0c;官方的tree组件&#xff0c;在层级很多时 elementui -tree 的高亮状态并没有选中整行。 &#xff08;衍生库 vue-easy-tree 也会出现此问题&#xff09; 原因&#xff1a; &#xff08;没有查看源码&#xff0c;只是根据dom简单定位…

实现 Trie (前缀树)

题目链接 实现 Trie (前缀树) 题目描述 注意点 word 和 prefix 仅由小写英文字母组成 解答思路 首先要理解前缀树是什么&#xff0c;参照该篇文章【图解算法】模板变式——带你彻底搞懂字典树(Trie树)在了解前缀树是什么后&#xff0c;设计前缀树就会更加容易&#xff0c;…

ZLMediaKit 各种推拉流

1 用ffmpeg 推音视频流 ./ffmpeg -f dshow -i video"HP Wide Vision HD Camera" -f dshow -i audio"麦克风阵列 (Realtek High Definition Audio)" -rtbufsize 100M -max_delay 100 -pix_fmt yuv420p -tune zerolatency -c:v libx264 -crf 18 -s 1280x720…

解决centos离线安装cmake找不到OpenSSL问题

安装方法&#xff1a;见另外一篇文章 https://blog.csdn.net/zhongxj183/article/details/118488629 按照文章下载了离线gcc 和OpenSSL&#xff0c;以及在cmake官网下载了最新版 cmake-3.27.4.tar.gz 顺利安装gcc 和OpenSSL 但执行编译cmake时&#xff0c;报错找不到OpenSSL…

11. 盛最多水的容器(c++题解)

11. 盛最多水的容器&#xff08;c题解&#xff09; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大…

leetcode刷题(字符串相加、包含每个查询的最小区间、模拟行走机器人、环形子数组的最大和、满足不等式的最大值、四数之和、树中距离之和)

目录 1、字符串相加 2、包含每个查询的最小区间 3、模拟行走机器人 4、环形子数组的最大和 5、满足不等式的最大值 6、四数之和 7、 树中距离之和 1、字符串相加 class Solution:def addStrings(self, num1: str, num2: str) -> str:i len(num1) - 1 # num1的末…

APP UI自动化测试思路总结

首先想要说明一下&#xff0c;APP自动化测试可能很多公司不用&#xff0c;但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的&#xff0c;所以为了更好的待遇&#xff0c;我们还是需要花时间去掌握的&#xff0c;毕竟谁也不会跟钱过不去。接下来&#xff0c;一…

VBA技术资料MF48:VBA_在Excel中将列号与字母转换

【分享成果&#xff0c;随喜正能量】除非自己的认知获得了改变和刷新&#xff0c;否则&#xff0c;人们常说的“顺应自己的内心”&#xff0c;顺的不过是一颗旧心&#xff0c;一颗惯性的&#xff0c;充满了各种习性的套路之心。与“顺应自己的内心”恰恰相反&#xff0c;人要用…

vue2 支持图片放大

添加 :preview-src-list属性 <el-imagev-for"item in specialData.urls":src"item":key"item.index":preview-src-list[item]class"pictrue"/>

AMEYA360:兆易创新获得ISO 26262 ASIL D流程认证, 汽车功能安全管理体系再上新台阶

中国北京(2023年8月29日) —— 业界半导体器件供应商兆易创新GigaDevice(股票代码 603986)今日宣布&#xff0c;获得由国际公认的测试、检验和认证机构通标标准技术服务有限公司(以下简称SGS)授予的ISO 26262:2018汽车功能安全最高等级ASIL D流程认证证书&#xff0c;这标志着兆…

python matlab 画柱状图

函数&#xff1a; bar(x, height, width0.8, bottomNone, *, aligncenter,dataNone, **kwargs) 设置坐标的刻度(ticks)&#xff0c;轴的标签和标题 在数据分析的很多时候&#xff0c;我们各个柱下面通常不是x刻度值&#xff0c;而是有实际意义的字符串&#xff0c;那么这个时…