测试题目气死人

文章讨论了几道编程题目,涉及括号的匹配检查、循环数组中找下一个更大元素以及合并果子的最小代价问题。解题策略包括使用栈和队列,如括号匹配的栈应用,优先队列在找下一个更大元素中的作用,以及线段树构建FBI树进行后序遍历。
摘要由CSDN通过智能技术生成

服了差不多每一题都要错几个案例我真的服了wok,什么鬼东西!!!

lx学长的羊圈

Description

lx学长是一个养羊大户,有成千上百个羊圈。可是却一次也没来羊圈帮过忙,今天他被叫来羊圈给羊羊们施展成双成对大法。关于成双成对大法,学长虽然没用实践过,但是他表现得胸有成竹。而成双成对大法需要类型相同的羊才能完成,不过lx学长不知道每个羊圈能否完成成双成对大法,lx学长太懒了,想请你帮帮他。

羊圈里面有三种类型的羊,分别为(),[].{},学长的羊圈和别家的羊圈不同,羊圈中也可能不只有羊。

学长会给你一串字符,不超过100个字符,可能包括括号、数组、字母、标点符号、空格,你的任务是检查这一串字符中的(),[],{}是否匹配。

Input

一行数据,不超过100个字符并含有( ,) ,[, ],{, }一个或多个。

Output

如果匹配就输出“yes”,不匹配输出“no”

Sample Input 1 

sin(20+10)

Sample Output 1

yes

Sample Input 2 

{[}]

Sample Output 2

no

题目理解这个题目还好,改一改也能对,就是一个栈来记录不同的左右符号,如果我们先找到任意一个左符号,比如(,那么我们就吧这个东西入栈,当下次找到一个右符号的时候,我们就把这个右符号和栈顶的那个符号进行对比,如果两个相同的话,我们的配对就成功!

#include <stdio.h>
#include <string.h>
int check(char left,char right)
{
    if(left=='('&&right==')')
    { 
   
        return 1;
    }
    
    if(left=='{'&&right=='}')
    { 
   
        return 1;
    }
    
    if(left=='['&&right==']')
    { 
   
        return 1;
    }
    
    return 0;
}
int main()
{
	int i,top=0;
	char str[101],chack[101];
	gets(str);
	int l=strlen(str);
	for(i=0;i<l;i++)
	{
		if(str[i]=='('||str[i]=='{'||str[i]=='[')
		{
			chack[top]=str[i];
			top++;
		}
		else if(str[i]==')'||str[i]=='}'||str[i]==']')
		{
			if(check(chack[top-1],str[i])==1)
			{
				top--;
				continue;
			}
			else{
				printf("no");
				return 0;
			}
		}
	}
	if(top==0)
	{
		printf("yes");
	}
	else{
		printf("no");
	}
}

下一个更大元素

Description

给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

Input

第一行为n,代表nums的大小(1≤n≤10000)

第二行 n个数

Output

输出一个长度n的数组,每个元素代表对应的循环数组中比i大的下一个元素

Sample Input 1 

3
1 2 1

Sample Output 1

2 -1 2

Sample Input 2 

5
1 2 3 4 3

Sample Output 2

2 3 4 -1 4

这个我真的无语,我开始直接把这个数组复制一遍,建立一个更大的数组,直接来查找,然后直接错掉,然后看大佬们不是两个数组,他们是对总长度取余也就是%,我发现这样子好像也是一样的意思,然后我就改成这样子,然后结果还是错一半我他妈的!!!这个地方连之前的代码什么的都看不了,也下载不了错误的数据wok

#include <stdio.h>
int main()
{
	int N;
	int i,j,teap;
	scanf("%d",&N);
	int a[10001];
	int b[10001];
	for(i=1;i<=N;i++)
	{
		scanf("%d",&a[i]);
		b[i]=-1;
	}
	for(i=1;i<=N;i++)
	{
		for(j=i+1;j<=2*N;j++)
		{
			if(a[j%N]>a[i])//取余就是一样的
			{
				b[i]=a[j%N];
				break;
			}
		}
	}
	for(i=1;i<=N;i++)
	{
		printf("%d ",b[i]);
	}
}

合并果子

Description

在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。     每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。     因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。     例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。

Input

输入包括两行,第一行是一个整数n(1< =n< =100000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1< =ai< =2000)是第i种果子的数目。

Output

输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于2^31。

Sample Input 1 

3 
1 2 9 

Sample Output 1

15

这题也死坑,我开始先是想着,他这不就是从小到大一直加过去就ok,然后我就用个普普通通的排序排一下,然后交上去直接错,我想着我思路也没错,我就换排序方法,换成快速排序,交上去,ok这次错一半,然后我实在想不出来了,去网上看大佬解答,发现思路和我都是一样的,就是找出最小的元素来相加,不过他们用的是优先队列(我压根不知道这什么东西,学都没学),就是去学了一下,然后发现直接c++的库函数一用一下子解决wok

#include<bits/stdc++.h>
#define M 10005
using namespace std;
priority_queue<int,vector<int>,greater<int> > Q;
int ans=0,n,x;
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>x;
		Q.push(x);
	}
	
	for(int i=1;i<n;i++)
	{
		int a=Q.top(); Q.pop();
		int b=Q.top(); Q.pop();
		ans+=a+b;
		Q.push(a+b);
	}
	cout<<ans;
	return 0;
}

FBI树

Description

我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。

FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2^N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:

1)T的根结点为R,其类型与串S的类型相同;

2)若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。

现在给定一个长度为2^n的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。

Input

第一行是一个整数N(0  < =  N  < =  10),第二行是一个长度为2^N的“01”串。

数据规模和约定,对于全部的数据,N  < =  10。

注:
[1]  二叉树:二叉树是结点的有限集合,这个集合或为空集,或由一个根结点和两棵不相交的二叉树组成。这两棵不相交的二叉树分别称为这个根结点的左子树和右子树。
[2]  后序遍历:后序遍历是深度优先遍历二叉树的一种方法,它的递归定义是:先后序遍历左子树,再后序遍历右子树,最后访问根。

Output

包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。

Sample Input 1 

3 
10001011 

Sample Output 1

IBFBBBFIBFIIIFF

这个题目还好,我看到就是刚刚好这几天学了线段树,从字节点开始建树,然后就线段树把树搞出来就直接后序遍历就ok,但是交上去还是错wokwokwok,错一半wok!!!

#include <stdio.h>
int a[100],tree[10000];
char b[100];
void creat(int node,int left,int right)
{
	if(left==right)
	{
		if(a[left]==1) tree[node]='I';
		else tree[node]='B';
		return;
	}
	int mid=(left+right)/2;
	creat(node*2,left,mid);//左树
	creat(node*2+1,mid+1,right);//右树
	if(tree[2*node]=='B'&&tree[2*node+1]=='B') tree[node]='B';
	else if(tree[2*node]=='I'&&tree[2*node+1]=='I') tree[node]='I';
	else tree[node]='F';
}
void houxu(int n)
{
	if(tree[2*n]) houxu(2*n);//左
	if(tree[2*n+1]) houxu(2*n+1);//右
	printf("%c",tree[n]);//根
}
int main()
{
	int i,j;
	int n;
	int ans=1;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		ans=2*ans;
	}
	//printf("888888");
	scanf("%s",b);
	for(i=1,j=0;i<=ans;j++,i++)
	{
		if(b[j]=='1') a[i]=1;
		else a[i]=0;
		//printf("%d ",a[i]);
	}
	creat(1,1,ans);
	houxu(1);
}

 真的写题目就气死人wok,我估摸着这几题都要栈和队列的知识来写(;´༎ຶД༎ຶ`) ,明天要猛学一下栈和队列,栈和队列太拉了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值