首页 > 其他分享 >week 3

week 3

时间:2023-10-16 18:14:52浏览次数:38  
标签:week ch int pos cin vector key

Week 3 线性表

P3613 【深基15.例2】寄包柜

  • 分析:此题直接用数组得1e9个格子,内存要爆

  • 知识点

    • map容器:

      find() 返回数据所在位置的迭代器

      insert() 插入pair

    • 迭代器:iterator,用于遍历容器元素(类似指针),输出*迭代器打印元素的值

  • 主要思路:vector容器嵌套map容器

    柜子数i当做vector的下标

    寄包的格子数j当做map的key值

    寄存的物品k当做map的val值

  • 注意:map的特点是不能出现重复key值,当有重复插入时会忽略而不是覆盖,所以要多加一个判断find(key) ,若已有,则调用erase函数将原key删除再插入新的

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,q,num,a,key,val; 
	cin>>n>>q;
	vector<map<int,int>> v;
	vector<int> s;
	//创建n个柜子 
	for(int i=0;i<n;i++)
	{
		map<int,int> mymap;
		v.push_back(mymap);
	}
	while(q--)
	{
		map<int,int>::iterator pos; //迭代器
		cin>>num;
		if(num==1)
		{
			cin>>a>>key>>val;
			pos=v[a-1].find(key);
			if(pos!=v[a-1].end())
			v[a-1].erase(pos);
			v[a-1].insert(pair<int,int>(key,val));
		 } 
		 else
		 {
		 	cin>>a>>key;
		 	s.push_back(v[a-1][key]);
		 }
	 } 
	 for(int i=0;i<s.size();i++)
	 cout<<s[i]<<endl;
	return 0;
}

P1241 括号序列

  • 一开始试图用两个栈ab存左右括号,试了半天没存明白,,,然后找到了更方便的题解,大佬还是大佬orz

  • 主要思路:是先找右括号,在往前找未被匹配的第一个左括号。

    用数组a标记该字符是否被匹配过,若匹配过则直接输出,未匹配就成对输出

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int a[105]={0};
    	string s;
    	cin>>s;
    	int len=s.length();
    	for(int i=0;i<len;i++)
    	{
    		if(s[i]==')')
    		{
    			for(int j=i;j>=0;j--) //这里不能直接j=i-1吧,i=0时可能会出错
    			{
    				if(s[j]=='('&&a[j]==0) 
    				{
    					a[i]=1;
    					a[j]=1;
    					break;
    				}
    				if(s[j]=='['&&a[j]==0)
    				break;
    			 } 
    		}
    		if(s[i]==']')
    		{
    			for(int j=i;j>=0;j--)
    			{
    				if(s[j]=='['&&a[j]==0) 
    				{
    					a[i]=1;
    					a[j]=1;
    					break;
    				}
    				if(s[j]=='('&&a[j]==0)
    				break;
    			 } 
    		}
    		}
    			for(int i=0;i<len;i++)
    		{
    			if(a[i]==0)
    			{
    				if(s[i]=='('||s[i]==')') cout<<"()";
    				else cout<<"[]"; 
    			}
    			else
    			cout<<s[i];
    	}
    	return 0;
    }
    

P1449 后缀表达式

  • 终于写到会做的题了喜大普奔感天动地可爱的后缀表达式

  • 知识点:队列的应用

  • 主要思路:遇到数字放进去,遇到运算符取栈顶两个数字,注意运算左右别错了!

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	stack<int>s;
    	char ch;
    	int a=0;
    	while(cin>>ch)
    	{
    		if(ch=='@')
    		break;
    		//如果是数字 
    		else if(ch<='9'&&ch>='0')
    		{
    			a=a*10+ch-'0';
    		}
    		else if(ch=='.')
    		{
    			s.push(a);
    			a=0;
    		}
    		else
    		{
    			int a1=s.top();
    			s.pop();
    			int b1=s.top();
    			s.pop();
    			if(ch=='+') s.push(a1+b1);
    			if(ch=='-') s.push(b1-a1);
    			if(ch=='*') s.push(a1*b1);
    			if(ch=='/') s.push(b1/a1);
    		}
    	}
    	cout<<s.top()<<endl;
    	return 0;
     } 
    

P1160 队列安排

  • 自己做出来但没完全做出来的一道....超时我真的恨

  • 虽然但是也掌握了vector一些用法8

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,m;
	vector<int> v;
	v.push_back(1);
	cin>>n;
	for(int i=2;i<=n;i++)
	{
		int k,p;
		cin>>k>>p;
		if(p==0)
		{
			 vector<int>::iterator it = find(v.begin(), v.end(), k);
			 if(it!=v.end())
			 v.insert(it,i);
		}
		else
		{
			 vector<int>::iterator it = find(v.begin(), v.end(), k);
			 if(it!=v.end())
			 v.insert(it+1,i);
		}
	}

	cin>>m;
	while(m--)
	{
		int x;
		cin>>x;
	    vector<int>::iterator it = find(v.begin(), v.end(), x);
		if(it!=v.end())
		v.erase(it);
	}
	for(vector<int>::iterator it=v.begin();it!=v.end();it++)
	{
		cout<<*it<<" ";
	}
	return 0;
 } 

看看正解:

  • 知识点:list的应用

  • list的底层是双向链表结构

  • 优点:与其他的序列式容器相比(array,vector,deque),list在任意位置进行插入、移除元素的执行效率更好。

  • 缺点:不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置。

#include<bits/stdc++.h>
using namespace std;

list<int>::iterator pos[100010];
//pos[x] 表示x的迭代器
list<int> L;
bool vis[100010];
int N, k, p, M, x;

int main()
{
    cin >> N;
    L.push_front(1);
    //默认1迭代器地址为begin
    pos[1] = L.begin();
    for(int i = 2; i <= N; i++)
    {
        cin >> k >> p;
        //insert返回值也为迭代器
        if(p == 0) pos[i] = L.insert(pos[k], i);
        else
        {
            //或者 auto nex = next(pos[k]);
            //往k的右边插入,要找到k的下一个迭代器,用next查找
            list<int>::iterator nex = next(pos[k]);
            pos[i] = L.insert(nex, i);
        }
    }
    cin >> M;
    for(int i = 0; i < M; i++)
    {
        cin >> x;
        if(!vis[x]) L.erase(pos[x]), vis[x] = true;
    }
    for(list<int>::iterator it = L.begin(); it != L.end(); it++) cout << *it <<" ";
    //或者 for(auto X : L) cout << X <<" ";
    return 0;
}

标签:week,ch,int,pos,cin,vector,key
From: https://www.cnblogs.com/xiaoyangii/p/17768011.html

相关文章

  • week16
    Week16目录Week16div2代码源每日一题501RSA503A-B数对504数位计算505新国王游戏506完美数507Lusir的游戏601BFS练习1(广度优先)60201序列2603整除光棍604碰撞刷题P4913二叉树深度div2代码源每日一题501RSA质数正常判断即可A*B大于1的整数的平方的整数倍......
  • week7
    Week7动态规划P1048[NOIP2005普及组]采药思路:跟背包问题的思路差不多,for循环遍历所有情况,把选该草药和不选该草药的价值情况比较大小,选大的。#include<bits/stdc++.h>usingnamespacestd;constintN=1005;intw[N],v[N];//草药的时间和价值intres[N][N];//前i......
  • week5
    Week5P8604[蓝桥杯2013国C]危险系数知识点:图的vector存储和+dfs思路:用一个数组来记录每个节点被访问的次数,如果起点和终点之间有点的访问次数和终点的访问次数一样,那么它就是关键点。#include<bits/stdc++.h>usingnamespacestd;constintN=10005;intm,n,u,v,to......
  • shctf week1 wp
    REez_asm程序的逻辑大概是把输入的数据flag按字节^0x1E-0x0A一遍,然后输出,所以只需要置反一下先+0x0A然后再^0x1e就能求出flag.text:0000000000401566loc_401566:;CODEXREF:main+65↓j.text:0000000......
  • Week 5
    week5本周工作是搭建项目框架:前后端配置完成,可以本地启动mybatis多数据源配置成功一个mapper对应多个mapper,根据配置选择sql建库表语句改造,sqlserver文件夹xml的sql语法改造数据库切换到sqlserver,并在页面上完成所有页面测试页面动态配置定时任务本周未进行知识补齐学......
  • Linux_JXNUSevenWeek_vi编辑器
    frompixivVI编辑器入门使用案例移动编辑文本编辑这里o的作用是回到原来光标的位置,其一个作用如:当我选择了灰色这一段内容,现在我的光标在其下面,现在我想要还要选择其上面一段内容,这个时候可以按o,然后光标回到原来的地方,现在可以按k,选择上面一段内容其......
  • Week 4
    week4进阶知识设计模式行为型设计模式模板方法模式模板方法模式是一种行为型设计模式,它在一个抽象类中定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。这样使得子类可以在不改变该算法结构的情况下,重新定义算法中的某些步骤。首先,我们创建一个抽象类,定义算法的......
  • [Leetcode Weekly Contest]365
    链接:LeetCode[Leetcode]2873.有序三元组中的最大值I给你一个下标从0开始的整数数组nums。请你从所有满足i<j<k的下标三元组(i,j,k)中,找出并返回下标三元组的最大值。如果所有满足条件的三元组的值都是负数,则返回0。下标三元组(i,j,k)的值等于(nums[i]......
  • CS50x-week7 SQL
    SQL是一种处理数据的编程语言先看看使用python是如何读入csv数据的importcsvwithopen("phonebool.csv","r")asfile:reader=csv.reader(file)forrowinreader:print(row[1])需要注意的是row[1]指的是每一行的第二个数据importcsvwithopen("p......
  • Linux_JXNUSixWeek_Linux三剑客—awk
    晚安,纺凪Dreamin'Her-僕は、彼女の夢を見る。awk简介具体基本用法:awk'$3>0{print$1,$2*$3}'emp.dataawk与sed一样,都是每一次读取一行,对一行进行处理后,继续进行下一行的处理$3表示一行中的第3列,其余同理$3>0被称为模式,{}中的指令被称为动作每一行中如果......