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,再入队
注意要先插入一个很大一个很小进去
相当妙的