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;
}