> 文章列表 > 小测试4.10

小测试4.10

小测试4.10

今天晚上进行可小测试

来看看题目都咋样吧!

附近的最小值

Description

fly学姐有一个序列a[1],a[2],...,a[n]。

给定一个正整数k,请问对于每一个1到n之间的序号i,a[i−k],a[i−k+1],...,a[i+k]这2k+1个数中的最小值是多少?

当某个下标超过1到n的范围时,数不存在,求最小值时只取存在的那些值。

Input

输入的第一行包含一整数n。

第二行包含n个整数,分别表示a[1],a[2],...,a[n]。

第三行包含一个整数k。

Output

输出一行,包含n个整数,分别表示对于每个序号求得的最小值

Sample Input 1 

5
5 2 7 4 3
1

Sample Output 1

2 2 2 3 3

Hint

对于 30% 的评测用例,1<=n<=1000,1<=a[i]<=1000。

对于 50% 的评测用例,1<=n<=10000,1<=a[i]<=10000。

对于所有评测用例,1<=n<=1000000,1<=a[i]<=100000

对题目的第一反应就是枚举

完全的按照题目给的思路来,

没想到不会卡时间一遍过

#include<stdio.h>int a[1000001];
int ans[1000001]={0};//答案数组int main(){
int n,k;
scanf("%d",&n);
for(int j=1;j<=n;j++)
scanf("%d",&a[j]);
scanf("%d",&k);for(int j=1;j<=n;j++){int minr=10000999;for(int g=j-k;g<=j+k;g++){if(g>=1&&g<=n&&a[g]<minr){minr=a[g];ans[j]=a[g];}//每个循环得出一个答案}
}for(int h=1;h<=n;h++)printf("%d ",ans[h]);//直接输出答案,不会存在没答案的return 0;
}

第一个题目,还是非常的友好的呀 ,爱了,爱了 

第二个

环形杀人事件

Description

一天,杀人狂魔李华突然想要杀人,就把他抓来的N个英雄依次分配一个编号,第一个人的编号为1号,第二个人的编号为2号,第N个人的编号就为N号,他们按顺序围成一个环形,现在给出一个数字M,第一个人开始从1报数,第二个人报的数就是2,依次类推,报到M这个数字的人被杀了(1a秒了),紧接着从被杀了的这个人的下一个人重新开始从1报数,和上面过程类似,报到M的人被杀,直到N个人全部被杀掉,请问,这个被杀的顺序是什么?

Input

给出两个正整数N、M

Output

输出被杀的顺序

Sample Input 1 

10 3

Sample Output 1

3 6 9 2 7 1 8 5 10 4

Hint

1<n<=10000

1<m<=100

这个我一看,没错就是递归来搞定,难度不大就是,写代码得细心,不要因为一点点的逻辑卡测试半天

而且可以用链表来写,用c++的我倒是觉得可以但是c语言手写链表,万一错了一点,从那开始纠正呀

可以用普普通通的数组加上一个标记数组解决的事情就不要太麻烦

上代码

#include<stdio.h>
int a[100050]={0};
int n,m;void kill(int x,int y){a[y]=1;printf("%d ",y);x--;
if(x==0){return;
}
else{int h=0;while(h!=m){y++;if(y>n){y=y-n;//我的数组是1到n所以不可以用取余,会出现0的(搞了半天)}if(a[y]==0){h++;}}kill(x,y);
}}int main(){
scanf("%d%d",&n,&m);
kill(n,m);
return 0;
}

难度也是一般般啦(不可以乱说的) 

下一个

lx学长羊圈

Description

lx学长是一个养羊大户,有成千上百个羊圈。可是却一次也没来羊圈帮过忙,今天lx学长被叫来羊圈给羊羊们施展成双成对大法。关于成双成对大法,lx学长虽然没有实践过,但是他表现得胸有成竹。而成双成对大法需要类型相同的羊才能完成,不过lx学长不知道每个羊圈能否完成成双成对大法,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>char a[12000];
char b[12000];int main()
{gets(a);int n=strlen(a);int top=0;int ans=1;for(int g=0; g<n; g++){switch(a[g]){case '(':b[top]='(';top++;break;case '[':b[top]='[';top++;break;case '{':b[top]='{';top++;break;case ')':if(top>=1){top--;if(b[top]!='(')ans=0;}else{ans=0;}break;case ']':if(top>=1){top--;if(b[top]!='[')ans=0;}else{ans=0;}break;case '}':if(top>=1){top--;if(b[top]!='{')ans=0;}else{ans=0;}break;default:break;}if(ans==0)break;}if(ans==1&&top==0){printf("yes\\n");}else{printf("no\\n");}return 0;
}

记得出栈比较是拿另外的一半符号比较,不和自己比,错了看了半天觉得没问题,反复测试数据发现了

我真的是离谱 ,遇到}就出栈看是不是}(咋可能是呀,右符号不入栈的)

下一个,下一个

下一个更大元素

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

这题目也是枚举呀

从1枚举到n

然后输出完全可以的,废话不多讲了直接上代码

#include<stdio.h>int n,nums[100000];void prin(int y){
if(y==n+1){return ;
}
else{for(int j=y+1;;j++){if(j>n)j=j-n;if(nums[j]>nums[y]){printf("%d ",nums[j]);break;}if(j==y){printf("-1 ");break;}}prin(y+1);}
}int main(){scanf("%d",&n);
for(int j=1;j<=n;j++)scanf("%d",&nums[j]);prin(1);return 0;
}

呜呜呜我是菜鸡,就写了折磨多

第5个不对堆,所以时间老是超限明天我要ko那题,再去看看最后一个 

ok

今天撒花谢幕啦啦啦啦!