首页 > 其他分享 >7.23第二周周二学习总结

7.23第二周周二学习总结

时间:2024-07-23 20:58:54浏览次数:10  
标签:总结 std long nums int 7.23 第二周 vec include

基础算法复习 (上午)

双指针

一本书P页,第i页有知识点ai,同一个知识点可能多次提到,希望通过连续的一些页把所有知识点都覆盖到。求出连续的最少页数

#include <iostream>
#include <algorithm>
#include <cmath>
#include <set>
#include <map>
#include <cstdio>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=1e6+10;

int a[maxn];
int n;
set <int> s; 
map <int,int> vis;
int main() {

	//ios::sync_with_stdio(0);
	//cin.tie(0);
	scanf("%d",&n);
	for (int i=0; i<n; i++) {
		scanf("%d",&a[i]);
		s.insert(a[i]);
	}
	int len=s.size();
	int l=0,r=0,cnt=0;
	int ans=n; 
	while (1){
		while (r<n && cnt<len){
			if (vis[a[r]]==0)							
				cnt++;			
			vis[a[r]]++;
			r++;
		}
		if (cnt<len) break;
		ans=min(ans,r-l);
		vis[a[l]]--;
		if (vis[a[l++]]==0)
			cnt--;
	}
	printf("%d\n",ans);
	return 0;
}

盛水问题

距离单调递减,所以我们保证长度较小的先去掉
image
image

去重元素,空间o1

删除数组nums 中的重复元素,使每个元素只出现一次。并输出去除重复元素之后数组的长度。
题解:
image

分离指针

分离双指针一般用于处理有序数组合并,求交集、并集问题。
image

三数之和

枚举i的位置,jz两个指针
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n=nums.size();
        vector<vector<int>> res;
        sort(nums.begin(),nums.end());
        for (int i=0;i<n;i++)
        {
            //当前项和前一项相同,则当前数字已经被刚才用过了,则直接跳过这个数字
            if (i>0 && nums[i]==nums[i-1])
            {
                continue;
            }
            //第二重循环同时遍历 j 和 z
            int z=n-1;  //初始化z的位置,z从后往前
            for (int j=i+1;j<n;j++)   //j从前往后
            {
                //同理,跳过重复的数字
                if (j>i+1 && nums[j]==nums[j-1])
                {
                    continue;
                }
                //同时需要保证j<z:因为j作为左指针一定要在z右指针的左边
                while (j<z && nums[i]+nums[j]+nums[z]>0)
                {
                    //因为序列从小到大排序,当前的结果大于0,则减小z,寻找合适的位置
                    --z;
                }
                //如果j 和 z相遇,则表示无论j再往后,z再往前,他们都不可能再有结果了(和为0),因为j再往后遍历的数字一定和z之前的一个数字相同; z也是,一定和j之前的一个数字相同,我们已经遍历过了,所以这种情况直接退出 
                if (j==z)
                {
                    break;
                }
                if (nums[i]+nums[j]+nums[z]==0)
                {
                    res.push_back({nums[i],nums[j],nums[z]});
                }
            }
        }
        return res;
    }
};

回文串问题

https://www.cnblogs.com/jiamian/p/11252214.html
https://blog.csdn.net/m0_74922218/article/details/136886949
(动态规划版)
image


算法竞赛书 二分 (下午)

函数补充

**lower_bound **

lower_bound(vec.begin(), vec.end(), 4)

upper_bound

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 4, 4, 5, 6};

    int x = 4;

    // 查找第一个不小于 x 的元素
    auto lb = std::lower_bound(vec.begin(), vec.end(), x);
    std::cout << "Index of the first element not less than " << x << ": " << (lb - vec.begin()) << std::endl;
    std::cout << "Value at this index: " << *lb << std::endl;

    // 查找第一个大于 x 的元素
    auto ub = std::upper_bound(vec.begin(), vec.end(), x);
    std::cout << "Index of the first element greater than " << x << ": " << (ub - vec.begin()) << std::endl;
    std::cout << "Value at this index: " << (ub == vec.end() ? "end" : std::to_string(*ub)) << std::endl;

    return 0;
}
//输出 4 2 4
       4 4 5

equal_range

返回第一个不小于给定值的迭代器,又返回第一个大于给定值的迭代器
image
**find **

在容器中查找第一个等于给定值的元素,并返回指向该元素的迭代器。如果没有找到,返回指向容器末尾的迭代器。
**binary_search **

binary_search(vec.begin(), vec.end(), 4);找不到返回false

用于检查元素是否存在于排序数组中

std::sort(vec.begin(), vec.end()); // 排序
std::reverse(vec.begin(), vec.end()); // 逆序

find_if

#include <algorithm>  // std::find_if
#include <vector>

std::vector<int> vec = {1, 2, 4, 4, 5, 7};
auto it = std::find_if(vec.begin(), vec.end(), [](int x) { return x > 4; });
// 查找第一个大于4的元素

二分

子数组最小值最大

(动态规划版)
动态规划

最大值最小化
有序列{2,2,3,4,5,1},划分为3个连续的子序列,子序列的和最大值最小
如(2,2,3),(4),(5,1)最大值最小为7

用二分法记录最大的值和在序列中最大的值3,而最大值最小一定在这里面。
(有点类似跳石头,跳石头枚举最小距离,最这个最小距离能否由拿走n块石头实现,这里枚举的使子序列和的最小值,看这样的最小值能不能在划分三次时成立)
类似的,划分数组为n个时,数组和的最大值(最小值最大)
csdn

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 7;
int n, m;
int a[maxn];
int check(int x) {
	int cnt = 1;
	int s = a[1];
	for (int i = 2; i <= n; i++) {
		if (s + a[i] <= x) s += a[i];
		else { s = a[i]; cnt++; }
	}
	return cnt;
}
int bin_search(int l, int r) {
	while (l < r) {
		int mid = l + (r - l) / 2;
		if (check(mid) <= m) {
			r = mid;
		}
		else {
			l = mid + 1;
		}
	}
	return l;
}
int main() {
	int t;
	ll mx, sum;
	cin >> t;
	while (t--) {
		mx = 0, sum = 0;
		cin >> n >> m;
		for (int i = 1; i <= n; i++) {
			cin >> a[i];
			sum += a[i];
			if (mx < a[i])
				mx = a[i];
		}
		int ans = bin_search(mx, sum);
 
		cout << ans;
	}
	return 0;
}

琐碎(下午)

洛谷模拟例题

image
运用ASCII码

#include<cstdio>
using namespace std;
int a[3];char s1,s2;
int main()
{
    while (scanf("%c:=%c;",&s1,&s2)==2)//充分利用c++语言优势
     a[s1-'a']=s2>='0' && s2<='9' ? s2-'0' : a[s2-'a']; //赋值语句简洁明了
    printf("%d %d %d",a[0],a[1],a[2]);
}

运用map

 #include<iostream>
    #include<map>//Map头文件
    #include<cstdio>
    using namespace std;
    map <char,int> num;//表示以char类型为下标,存储的是int
    string st;
    int main(){
        cin>>st;//输入
        int len=st.length();
        num['a']=num['b']=num['c']='0';//注意初始化。。。。被坑了
        for(int i=0;i<len;i+=5)
          if(st[i+3]>='0'&&st[i+3]<='9')//注意判断是不是0~9
            num[st[i]]=st[i+3];//直接取出数字赋值给对应变量
           else num[st[i]]=num[st[i+3]];//变量之间相赋值
        printf("%c %c %c",num['a'],num['b'],num['c']);
        //输出三个变量
        return 0;
    }

技巧

为了防止多组测试,直接

while(cin>>n);

const long double pi=acosl(-1.0);//圆周率

sinl(),cosl()//三角函数的long double 版本
sinf//float版本
sin()//double

cout<<fixed<<serprecision(6);

头文件

#include<iostream>
#include<algorithm>//数学
#include<cstdio>
#include<cstring>
#include<cmath>//数学
#include<cctype>
#include<iomanip>
#include<map>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<set>
#include<cctype>
#include<string>
#include<stdexcept>
#include<fstream>

vj团队赛2 (补题)

求最大公约数

有一个整数 n,1-n个数字分成两组,每一组至少有一个数,并且使得两组数字的和的最大公约数最大,请输出最大的最大公约数。
image
(即gcd a,b是sum的因子)

#include <iostream>   
#include <cstdio>    
#include <iomanip>
#define int long long
using namespace std;
const int N=1e5+10;
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int n;
    cin>>n;
    int sum=n*(n+1)/2;
    for(int i=2;i<=n/2;i++){
        if(sum%i==0) 
        {
            cout<<sum/i<<endl;
            break;
        }
    }
    return 0;
}

七巧板

第一次6,第二次7...规律
int t=7+(6+n-1+6)*n/2;

圆内面积最大值

image

标签:总结,std,long,nums,int,7.23,第二周,vec,include
From: https://www.cnblogs.com/hoshino-/p/18317542

相关文章

  • 架构演化思考总结(1)
    架构是什么?答:架构是对依赖的统一管理。什么是依赖?分为几种?我们为什么要对它进行管理。依赖就是持有对象,或者说是持有一个非空的引用。单向依赖正如项目开发中,对象和对象之间都会有相互持有、相互调用的需求的。而对象间的持有就是一种依赖。A想要完成一个逻辑处理,需要调用B的......
  • 7.23赛后总结
    T1牛式得分:14题型:暴力枚举枚举思路完全错误,过于复杂,成功的只A了一个点.T2song得分:50(洛谷),0(评测机)题型:模拟不知道为什么评测机评测不出来时间太紧,导致符号敲错,‘+‘敲成’-’T3skate题型:深度优先搜索得分:50在DFS函数末尾取消了对路径的标记,导......
  • 【闲话】07.23.24
    0723闲话头图:今日推歌:《死别feat.GUMI》シャノンさよなら夏、また会う日まで再见了夏天,直到再见的那天さよなら夏、君との思い出再见了夏天,和你一起的回忆もしもそうじゃなかったら“假如不是这样的话……”なんてこわいこと我试着想象了一下考えてみたよ这种可......
  • 2024.7.23 Linux——DNS服务搭建(day12)
    (一)搭建nginx1.首先布置基本环境要求能够ping通外网,有yum源2.安装nginxyum-yinstallnginx然后查看验证 3.修改网页配置文件修改文件,任意编写内容,然后去物理机测试(二)创建一台客户端1.模拟一下客户,用母机克隆一台作为我们的客户端然后只需修改地址,保证能够ping......
  • 2024-7-23 信友队模考总结
    开考题目难度应该是升序的,开T1发现看着不简单,就有点突突。T2看起来比较简单,想到了双指针,但是方向不对,搞了20min出不来就回去看T1。开写T1想出来就很好写了,想到两个点就可以组成一条边从而确定一个正方形(当然没有对角线),直接\(\mathcal{O}(n^2)\)暴力枚举判断就可以了,......
  • 【Android】ListView和RecyclerView知识总结
    文章目录ListView步骤适配器AdpterArrayAdapterSimpleAdapterBaseAdpter效率问题RecyclerView具体实现不同布局形式的设置横向滚动瀑布流网格点击事件ListViewListView是Android中的一种视图组件,用于显示可滚动的垂直列表。每个列表项都是一个视图对象,ListVie......
  • OpenHarmony开发实战:引导组件规范总结
    介绍基于OpenHarmony的高亮型新手引导组件,通过高亮区域与蒙版背景的明暗度对比,使用户快速锁定重点功能,快速掌握应用基本使用方法。下载安装1.安装ohpminstall@ohos/high_light_guideOpenHarmonyohpm环境配置等更多内容,请参考如何安装OpenHarmonyohpm包 。2.在需......
  • GCN知识总结
    关键点:1.理解图结构的形式2.如何使用邻接矩阵实现其图结构形式3.GCN卷积是如何实现节点特征更新的核心公式:特征提取:处理好的x代表节点特征,然后*权重,再*邻接。A尖换元后:forward函数传播规则:loss:1.......
  • C语言指针易混淆知识点总结
    指针定义指针是一个变量,存储另一个变量的内存地址,它允许直接访问和操作内存中的数据,使得程序能够以更灵活和高效的方式处理数据和内存。获取变量地址:使用取地址符&。访问地址上的数据:使用解引用符*。例子1指针是存储另一个变量地址的变量。通过使用取地址符&和解引用符......
  • 7.22日今日总结之CRC8校验
    今日学习通讯协议时,发现客户的数据采用了CRC8校验,之前用的都是和校验或者异或校验,头次使用CRC8校验,因此上网查阅资料学习了一下。CRC8校验一般使用的多项式为X8+X2+X1+1CRC8算法是通过对数据进行模2除法运算来计算余数,也称异或运算,然后将余数附加到原始数据后面,形成被校验的数据......