今天早上写的,中午太困了,就拖到晚上啦。这几题写下来的感觉就是好像都写过,都有思路,但是代码写的不是很顺利,应该是有点不熟练了,5555,早知道提醒人美心善的xF复习一下了,昨晚还一起打游戏。
A去除重复字母
题意:意思很简单,就是去除重复字母,然后输出就好了
思路:就是根据题目的意思,前面出现过的就不输出了(本来想着set不就可以去重了嘛,快写完想起来set会自动排序,删了重写!)
emmm,这道题写一个小时的话,呃,说明你真的很执着,想知道你当时的心态hhh,没事的。
知识点:线性表
code:
#include
using namespace std;
int main(){
string a;
while(cin>>a){
vectorv;
int b[30]={0};//标记某个字母是否出现过
for(int i=0;i
B.简单除法
题意:就是大家都会的除法
思路:注意一下四舍五入就好了
code:
#include
using namespace std;
int main(){
int a,b;
while(cin>>a>>b){
if(b==0){
cout<<"error"<=0.5)cout<
C士兵队列
题意:和约瑟夫环处理差不多,对士兵队列进行若干次遍历,直到最后士兵数不大于3,区别在于:本题每次报数都是从第一个开始,而且出列士兵的序号数会在2和3之间变化。唉,这个是我倒数第二个写出来的题,原因在最后输出队列元素的时候有点问题,我竟然一直没怀疑,找了好久哼。
思路:像约瑟夫环那样模拟一下就好了
知识点:线性表/队列
code:
#include
using namespace std;
typedef long long ll;
int main(){
int t;
cin>>t;
while(t--){
queueq;
int n;
cin>>n;
for(int i=1;i<=n;i++){
q.push(i);
}
int count=1;
int num=2;
while(q.size()>3){
int p=q.size();
if(count%2)num=2;
else num=3;
for(int i=1;i<=p;i++){
if(i%num==0){
q.pop();
}
else {
int x=q.front();
q.pop();
q.push(x);
}
}
while(q.front()!=1){
int x=q.front();
q.pop();
q.push(x);
}
//cout<
D括号匹配
题意:就是最简单的括号匹配问题。。。。先看一张图
极限通过,真服了,我一直WA,然后把题目想复杂了,但还是WA,最最后才发现是我的NO大小写错了,哎呀,我在这篇文章的时候又开始生气了哈哈哈哈。
思路:栈的应用题,左括号入栈,右括号出栈,中间出现一些特殊情况就会不匹配(也可以数一下左括号和右括号的个数来判断,注意左括号必须在第一个,右括号必须在第二个)
知识点:栈
code:
#include
using namespace std;
typedef long long ll;
int main(){
/*queueq;
int t;
cin>>t;
while(t--){
int count=0;
}*/
string s;
cin>>s;
stackst;
for(int i=0;s[i]!='@';i++){
if(s[i]=='('){
st.push(s[i]);
if(i==s.size()-1)break;
if(s[i+1]=='+'||s[i+1]=='-'||s[i]=='*'||s[i]=='/'){
cout<<"NO"<
E铁轨
题意:判断出栈的顺序是否合理
思路:用栈模拟,例如假如5出栈,那么必须有1,2,3,4,5已经入栈,然后5再出栈,最后判断栈是否为空就好了
知识点:栈
(怎么这么多栈)
code:
#include
using namespace std;
typedef long long ll;
int main(){
int n;
while(cin>>n){
if(n==0)break;
int a[1005]={0};
int x;
while(cin>>x){
stacks;
if(!x)break;
a[0]=x;
for(int i=1;i>a[i];
}
int p=2;
for(int i=0;i
F新二叉树
题意:每行给定根节点,左孩子节点,右孩子节点,根据所给序列建立二叉树,输出该二叉树先序遍历序列。
思路:根据序列建立二叉树(具体可以看代码),然后先序输出
知识点:二叉树
code:
#include
using namespace std;
typedef long long ll;
int n,root,l[1005],r[1005];
string s;
void fun(int t){
if(t!='*'-'a'){
cout<>n;
for(int i=0;i>s;
if(i==0){
root=s[0]-'a';
}
l[s[0]-'a']=s[1]-'a';
r[s[0]-'a']=s[2]-'a';
}
fun(root);
}
G.围栏修复
题意:题目不太记得了,因为有太多版本了hhh。
思路:每次取最小的两个数出列,相加,将结果放入原队列,直到队列只剩一个元素。
知识点:优先队列,哈夫曼树
code:
#include
using namespace std;
typedef long long ll;
int main(){
int n;
priority_queue,greater>qp;
cin>>n;
for(int i=0;i>x;
qp.push(x);
}
ll ans=0;
while(qp.size()>=2){
int a=qp.top();
qp.pop();
int b=qp.top();
qp.pop();
ans+=(a+b);
qp.push(a+b);
}
cout<
上面代码都是考试的时候写的,不一定是最好的,仅供参考。