每日一结

E-  刺激的山谷

给你一个n个整数的数组a[0...n-1]。如果存在恰好一个子数组a[l...r],使之成为一个 "谷"。

这里有三个例子。

  • 0≤l≤r≤n−1,
  • al​=al+1​=al+2​=⋯=ar​,
  • l=0 or  al-1>al
  • r=n−1 or ar<ar+1

第一张图片显示了数组[3,2,2,1,2,2,3],它是一个山谷,因为只有指数l=r=3的子数组满足条件。

第二张图片显示了数组[1,1,1,2,3,3,4,5,6,6,6],它是一个山谷,因为只有索引为l=0,r=2的子数组满足编码条件。

第三张图显示了数组[1,2,3,4,3,2,1],它不是一个山谷,因为有两个子数组l=r=0和l=r=6满足这个条件。

你被问及所给的数组是否是山谷。

请注意,我们认为数组的索引是从0开始的。

Input

第一行包含一个整数t(1<=t<=1e4)-测试案例的数量。

每个测试用例的第一行包含一个整数 n (1≤n≤2⋅105) --数组的长度。

每个测试用例的第二行包含n个整数ai​ (1≤ai​≤109) --数组的元素。

可以保证所有测试用例的n之和小于2⋅105.

Output

对于每个测试案例,如果数组是山谷,则输出 "YES"(不带引号),否则输出 "NO"(不带引号)。

你可以在任何情况下输出答案(例如,字符串 "yEs"、"yes"、"Yes "和 "YES "将被识别为一个肯定的答案)。

Sample 1

这道题主要考察的是思维逻辑的转变

解题思路:看到题目的时候,我首先想的问题是什么才是山谷,观察结合给出的例子,可以发现山谷大致分为俩种情况,一种为山两边构成的谷,一种是山与山之间的谷。在分出在两边的情况后,遵从先下坡后上坡的原则进行判断便能解决问题。要注意的是要找出其中的子数组,再用子数组的俩边进行判断,得出结果

具体代码如下:

#include<stdio.h>
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        int stu[200000];
        int n,j,k,l,r,sum=0;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d",&stu[i]);
        }
        if(n<3)printf("YES\n");
        else{
        for(int i=0;i<n; ){
            l=i;
        for(int i=l;i<n;i++){
        if(stu[l]==stu[i])
            r=i;
        else break;}
        if((l==0||stu[l]<stu[l-1])&&(r==n-1||stu[r]<stu[r+1]))
           sum++;
           if(sum==2)break;
        i=r+1;
    }
    if(sum==1)printf("YES\n");
    else printf("NO\n");
}}}

数学黑洞

【问题描述】

任给一个4位正整数,其各位数位上的数字不全相同,将数字重新组合成一个最大的数与最小的数相减,重复这个过程,最多7步,必得6174。对任给的4位正整数(各位数位上的数字不全相同),编程输出掉进黑洞的步数。

【输入】

一行,一个4位正整数n(1000< n<9999)

【输出】

掉进黑洞的步数

输入

1234

输出

3

题目不难,用的一种递归的解法

解题思路:首先题目已经给定是一个四位数,所以所需循环的次数也定下来了,将四位数各位放在一个数组之中,用两个大小排列的函数,对该数进行相减后,继续执行这轮操作直至得到目标数,最终返回函数调用次数的值

#include <stdio.h>
#include <math.h>
int min(int a[4]){              
    int z=0;
   for(int i=0;i<3;i++){            
    for(int j=0;j<3-i;j++){
       if(a[j]>a[j+1]){int t=a[j+1];a[j+1]=a[j];a[j]=t;
       }}}
for(int i=0;i<4;i++)z=10*z+a[i];   //返回四位组成最小数
return z;
}
int max(int a[4]){        
    int z=0;
   for(int i=0;i<3;i++){          
    for(int j=0;j<3-i;j++){
       if(a[j]<a[j+1]){int t=a[j+1];a[j+1]=a[j];a[j]=t;
       }}}
for(int i=0;i<4;i++)z=10*z+a[i]; //返回四位组成最大数
return z;
}

int F(int x,int sum){    
   int a[4];
   if(x==6174)return sum;     //使用递归函数,当值为6174时返回函数调用次数
  else{ for(int i=0;i<4;i++){
    a[i]=x%10;
    x/=10;
   }
   x=max(a)-min(a);sum++;  //最大数减最小数后,继续调用函数,sum加1
   F(x,sum);}
}

int main()
{
  int F(int x,int sum);
  int x,sum=0;         
  scanf("%d",&x);
  printf("%d",F(x,sum));
  return 0;
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值