今天晚上进行可小测试
来看看题目都咋样吧!
附近的最小值
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文章来源:https://www.toymoban.com/news/detail-410431.html
今天撒花谢幕啦啦啦啦!文章来源地址https://www.toymoban.com/news/detail-410431.html
到了这里,关于小测试4.10的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!