服了差不多每一题都要错几个案例我真的服了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,我估摸着这几题都要栈和队列的知识来写(;´༎ຶД༎ຶ`) ,明天要猛学一下栈和队列,栈和队列太拉了