主要是完成了剩下的题目以及粗虐的了解了kmp算法
题一:表达式求值
将*进行处理
#include <bits/stdc++.h>
#include <stack>
using namespace std;
int main() {
stack<int> s;//创建队列
int a, b;
cin >> a;//读入第一个数
const int m = 10000;
a %= m;
s.push(a);//将第一个数压入栈中
char c;
while (cin >> c >> b) 输出结果前按下回车键后再输入ctrl加z就可以的到结果了
{
if (c == '*') {//遇到*就将*后面的b与栈顶元素相乘再压入栈中这样只要将栈中所有元素相加就能得到结果
int t = s.top();//先把此元素存下来再删掉防止出现问题
s.pop();
s.push(t * b % m);
} else {
s.push(b);
}
}
int sum = 0;
while (!s.empty()) //一值加到栈为空
{
sum = (sum + s.top()) % m;//对栈中元素进行累加的结果
s.pop();
}
cout << sum << endl;
return 0;
}
题二:
这题的题目好长
#include<stdio.h>
int a[6][500005],q[6];
int sum=0;
int main()
{int n,p;
scanf("%d%d",&n,&p);
int x,y;//这里的x表示某根贤y表是某段
for(int i=1;i<=n;i++){
scanf("%d %d",&x,&y);
while(a[x][q[x]]>y){
q[x]--;//释放某段的操作
sum++;//记录步数
}
if(a[x][q[x]]<y){
a[x][++q[x]]=y;//按下某段
sum++;//记录步数
}
}
printf("%d",sum);
return 0;
}
kmp(串的匹配)萌新版理解:
八皇后问题
#include<bits/stdc++.h>
using namespace std;int n;
int c[10000],p[10000],q[10000];
int a[10000];
int flag,b;
void print()
{
if(flag<=3)
{
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
}
void dfs(int x)
{
if(x>n)//表示已经每行排满了可行
{
flag++;
b++;//对可行方案进行累加
print();//输出
return;//放回至上次调用
}
for(int i=1;i<=n;i++)
{
if(c[i]!=1&&p[i+x]!=1&&q[i-x+n]!=1)
{
a[x]=i;
c[i]=p[i+x]=q[i-x+n]=1;//将行列及两条对角线标记p是/q是\;
dfs(x+1);//下一行
c[i]=p[i+x]=q[i-x+n]=0;//撤回标记
}
}
}
int main()
{
cin>>n;
dfs(1);//从第一行开始搜
cout<<b;
}