线性表 数组yyds

P3613

#include<bits/stdc++.h>
using namespace std;
int p;
long long int i,j,k;
map<long long,int>b;

int main()
{
	int m,n;
	cin>>m>>n;
	while(n--)
	{
		cin>>p>>i>>j;
		if(p==1)
		{
			cin>>k;
			b[i*10000000+j]=k;
		 } 
		 else cout<<b[i*10000000+j]<<endl;
	 } 
	 return 0;
}

担心数组开的大怎么办,就把他表示出来,但是乘上的这个数字必须比他本身范围大,然后还不能爆掉, long long int
存和取就其实没啥区别

P1449

#include<bits/stdc++.h>
using namespace std;
int main()
{   long long int zhan[100000]; 
    int num=0,i=0;
    char str;
	while((str=getchar())!='@')
	{
		if(str>='0'&&str<='9')
		{
			num*=10;
			num+=str-'0';
		}
		if(str=='.')
		{	zhan[++i]=num;
		num=0;
		}
	    if(str=='+')
	    {
	    	zhan[i-1]=zhan[i-1]+zhan[i];
	    	zhan[i]=0;
	    	i--;
	    	
		}
		if(str=='-')
	    {
	    	zhan[i-1]=zhan[i-1]-zhan[i];
	    	zhan[i]=0;
	    	i--;
	    	
		}
		if(str=='*')
	    {
	    	zhan[i-1]=zhan[i-1]*zhan[i];
	    	zhan[i]=0;
	    	i--;
	    	
		}
		if(str=='/')
	    {
	    	zhan[i-1]=zhan[i-1]/zhan[i];
	    	zhan[i]=0;
	    	i--;
	    	
		}
	}
	cout<<zhan[1];
	return 0; 
}

既然有计算,那么数字就必须是数字,不是字符数组,然后就遇到数字就存,遇到符号就运算然后还回去,模拟战的感觉


stack<int>q;
string c;

int main()
{
    cin>>c;
    int a=0,b=0;
    int i,j;
    for(int k=0;k<c.length();k++)
    {
    	if(c[k]=='@') break;
    	else if(c[k]=='.'){
    		q.push(a);
    		b=0,a=0;
		}
    	else if(c[k]<='9'&&c[k]>='0'){
    		a=b*10+c[k]-'0';
    		b=a;
		}
		else{

			if(c[k]=='-') i=q.top(),q.pop(),j=q.top(),q.pop(), q.push(j-i);
			if(c[k]=='+') i=q.top(),q.pop(),j=q.top(),q.pop(), q.push(j+i);
			if(c[k]=='*') i=q.top(),q.pop(),j=q.top(),q.pop(), q.push(j*i);
			if(c[k]=='/') i=q.top(),q.pop(),j=q.top(),q.pop(), q.push(j/i);
		}
	}
	cout<<q.top()<<endl;

}

p1540

#include<bits/stdc++.h>
using namespace std;
queue<int>q;
int main()
{
	int m,n,chazhao=1,cont=0,a[10000];
	bool v[1005];
	cin>>m>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		
	}

	
		for(int j=0;j<n;j++)
		{
			
			if(v[a[j]]) continue;
			else
			{
				if(q.size()>=m)
				{
					v[q.front()]=0;
					q.pop();
				}
			}
			q.push(a[j]);
			v[a[j]]=1;
			cont++;
		
				
			
		}
		
	
	cout<<cont;
	return 0; 
	
}

需要一个数组来标记有没有判断过
到一定数量了还要撤回
每入一个查一个

P1160

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int mx=1e5+10;
int n,m;
struct T{
    int l,r;        //每个同学的“左右手” 
	int d;          //表示同学是否输出 
}t[mx]={0};
void add(int i,int k,int f)       //新增同学 
{
    if(f==1)         //左 
    {
        t[k].r=t[i].r;
        t[k].l=i; 
        t[i].r=k;
        t[t[k].r].l=k;
    }
    else             //右 
    {
        t[k].r=i;
        t[k].l=t[i].l;
        t[i].l=k;
        t[t[k].l].r=k;
    }
}
int main()
{
    int x,k,f;
    cin>>n;
    t[0].r=0,t[0].l=0;
    add(0,1,1);找不到开头怎么办
    for (int i=2;i<=n;i++)
    {
        cin>>x>>f;
        add(x,i,f);
    }
    cin>>m;
    while(m--)
    {
        cin>>x;
        t[x].d=1;         //将该同学标记为不输出 
    }
    for (int i=t[0].r;i;i=t[i].r)
    {
        if (t[i].d==0)    //输出未标记的 
          cout<<i<<" ";
    }
    return 0;
}

能想到这种做法的我是%%%了
首先解决删除,直接设置在结构体里,很妙
然后是增加,设置了左手右手,这个for循环勾起了我图论不太美妙的回忆
稍微解释一下
2 1之间插入0 就是在1的左边插入
则0的右手是指向a,0的左手指向1的左边的
1的左边的右边指向0,1的左边是0
找不到开头就自己加一个

就是模拟链表啦
P1241

 #include<stdio.h>
#include<string.h>
struct node
{
	char a;
	int m;
}kuo[110];
bool b[110];
int main()
{
	char str1[110];
	scanf("%s",str1);
	memset(b,0,sizeof(b));
	int top=0;
	int len=strlen(str1);
	
	for(int i=0;i<len;i++)
	{
		if((str1[i]=='(')||(str1[i]=='['))
	    {
	    	kuo[top].a=str1[i];kuo[top].m=i;top++;
		}
		
		if((str1[i]==')')&&(kuo[top-1].a=='(')) {b[i]=1;b[kuo[top-1].m]=1;top--;}
		if((str1[i]==']')&&(kuo[top-1].a=='[')) {b[i]=1;b[kuo[top-1].m]=1;top--;}
	}
	for(int i=0;i<len;i++)
	{
		if(b[i]==1) printf("%s",str1[i]);
		else
		{
			if ((str1[i]=='(')||(str1[i]==')')) printf("()");
			if ((str1[i]=='[')||(str1[i]==']')) printf("[]");
		}
	}
	return 0;
 } 

就是说所有的左括号入栈,然后出栈,看是不是相同

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int a[105]; // 标记

int main()
{
    int i,j;
    string s;
    cin >> s;
    for (i=0; i<s.length(); i++) {
        if (s[i] == ')') { // 找到了右括号
            for (j=i-1; j>=0; j--) {
                if (s[j] == '(' && a[j] == 0) { // 找到了没被匹配过的左括号且匹配成功
                    a[i] = a[j] = 1;
                    break;
                }
                else if (s[j] == '[' and a[j] == 0) break; // 找到了左括号但匹配失败
            }
            // 找不到左括号,不做任何操作
        }
        // 下面同理
        else if (s[i] == ']') {
            for (j=i-1; j>=0; j--) {
                if (s[j] == '[' and a[j] == 0) {
                    a[i] = a[j] = 1;
                    break;
                }
                else if (s[j] == '(' and a[j] == 0) break;这就可以确定顺序来
            }
        }
    }
    for (i=0; i<s.length(); i++) {
        if (a[i] == 0) { // 没有匹配则成对输出
            if (s[i] == '(' or s[i] == ')') cout << "()";
            else cout << "[]";
        }
        else cout << s[i]; // 匹配成功则直接输出
    }
    return 0;
}

确定顺序:如果不是配对的就break
输出那些打标记的

P2234
set敲起来
stl用起来

#include<iostream>
#include<set>
#include<cmath> 
#include<algorithm>
using namespace std;
set<int>s;
set<int>::iterator k,a;
int ans=0;
int main()
{
	int m,x;
	cin>>m;
	s.insert(0x7fffffff);
    s.insert(-0x7ffffff);

	for(int i=1;i<=m;i++)
	{
		cin>>x;
		if(s.size()==2)
		{
			ans+=x;
			s.insert(x);
		}
		else
		{
			k=s.lower_bound(x);//大于等于 
			if(*k!=x)
			{
				a=k;
				a--;
				ans+=min(abs(*a-x),abs(*k-x));
				s.insert(x);
			}
		}

	}
	cout<<ans;
	return 0;
}

每输入一次,先寻找ans,再入队
注意要先插入一个很大一个很小进去
相当妙的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值