本文主要是介绍ACM学习笔记__week3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 前言
- 一、栈
- 二、链表
- 三、栈
- 总结
前言
ACM_week3 这周莫名其妙多了个NECCS竞赛,还是花一点时间准备叭,暂时还没做完,会补题的555
提示:以下是本周训练题目,下面代码可供参考
一、栈
输入输出略
翻译过来的题目大意大概就是给出两个序列A、B,判断是否能通过栈使得A转换成B。
思路:将A的序列存入Stack数组与B序列一一比较。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
char in[20000],out[20000];//存入输入、输出字符串
char Stack[20000];//模仿栈的数组
bool Move[50000];//记录进栈出栈 true进false出
int main()
{int n;while(scanf("%d",&n)!=EOF){int top=-1;int pop=0;int len=0;memset(in,0,sizeof(in));memset(out,0,sizeof(out));memset(Stack,0,sizeof(Stack));memset(Move,0,sizeof(Move));scanf("%s %s",&in,&out);for(int i=0; i<n; i++){Stack[++top]=in[i];Move[len++]=true;while(Stack[top]==out[pop]&&top>=0){top--;Move[len++]=false;pop++;}}if(pop==n){printf("Yes.\n");for(int i=0; i<len; i++)if(Move[i]){printf("in\n");}else{printf("out\n");}printf("FINISH\n");}elseprintf("No.\nFINISH\n");}return 0;
}
二、链表
思路:用数组模拟全过程就好啦,但是要注意输出的是最初的编号。
代码如下(示例):
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;int main()
{int N;int member[5010];scanf("%d",&N);while(N--){int n;scanf("%d",&n);memset(member,0,sizeof(member));for(int i=1;i<=n;i++){member[i]=i;}int len=n;int mod=2;while(len>3){int k=0;if(mod==2){for(int i=1;i<=n;i++){if(member[i]&&++k==2){k=0;member[i]=0;len--;}}mod=3;}else{for(int i=1;i<=n;i++){if(member[i]&&++k==3){k=0;member[i]=0;len--;}}mod=2;}}int cnt=0;for(int i=1;i<=n;i++){if(member[i]){if(cnt==0){cout<<i;cnt=1;}else{cout<<" "<<i;}}}cout<<endl;}return 0;
}
三、栈
思路:一组一组存入进行计算,遇到加减cnt自增后直接保存,遇到乘除就cnt不自增对上一个数进行计算。题倒不难,但是真的卡了我好久,最后发现是编译器版本的问题…
代码如下(示例):
#include <iostream>
#include<cstdlib>
#include<cstring>
using namespace std;int main()
{double str[205];double a;char op;double num;char space;int cnt=0;while(scanf("%lf",&a)!=EOF){char ch=getchar();if(a==0&&ch=='\n'){break;}memset(str,0,sizeof(str));cnt=0;str[++cnt]=a;while(scanf("%c %lf%c",&op,&num,&space)!=EOF){if(op=='+'){cnt++;str[cnt]=num;}else if(op=='-'){cnt++;str[cnt]=-num;}else if(op=='*'){str[cnt]*=num;}else if(op=='/'){str[cnt]/=num;}if(space!=' '){break;}}double ans=0;for(int i=1;i<=cnt;i++){ans+=str[i];}printf("%.2lf\n",ans);}return 0;
}
总结
这篇关于ACM学习笔记__week3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!