第一次写这种题。。。
写完之后感觉不是太难,但我也不能做到思路清晰的一下写对。先从分析题目开始:
问题描述
在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0 给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
有问题描述可得,这道题考察的是数组,再按照题中所给条件求三元组中心的个数。
输入格式
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], …, a[n],相邻的整数间用空格分隔,表示给定的数列。
输出格式配合下面的样例输出来看。只是做的时候我不太清楚能不能写 “ 请输入····· ” ,后来看了一些别人的代码发现都没写,那应该就是不用。而且写了的话与下面的样例输入不符。
我又去官方练习模块看了看,确实不能。“ 在测试的时候,系统会自动将输入数据输入到你的程序中,你不能给任何提示。比如,你在输入的时候提示“请输入A、B”之类的话是不需要的,这些多余的输出会使得你的程序被判定为错误。”
输出格式
输出一行包含一个整数,表示答案。
要点: 输出独占一行,整数。
样例输入
5
1 2 5 3 5
样例输出
2
样例说明
a[2] 和 a[4] 可能是三元组的中心。
对输入输出的说明,代码运行后应该出现的样子,样例说明就是把上面题的答案说一下,防止你自己不会算。
评测用例规模与约定
对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。
对于所有评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。
说实话,我第一次写,不太懂这个说明是干嘛的。
说明:“数据规模与约定”中给出了试题中主要参数的范围。
这个范围对于解题非常重要,不同的数据范围会导致试题需要使用不同的解法来解决。比如本题中给的A、B范围不大,可以使用整型(int)来保存,如果范围更大,超过int的范围,则要考虑其他方法来保存大数。
有一些范围在方便的时候是在“问题描述”中直接给的,所以在做题时不仅要看这个范围,还要注意问题描述。
例:
数据规模与约定
1 <= n <= 1,000,000,000。
说明:请注意这里的数据规模。
本题直接的想法是直接使用一个循环来累加,然而,当数据规模很大时,这种“暴力”的方法往往会导致超时。此时你需要想想其他方法。你可以试一试,如果使用1000000000作为你的程序的输入,你的程序是不是能在规定的上面规定的时限内运行出来。
本题另一个要值得注意的地方是答案的大小不在你的语言默认的整型(int)范围内,如果使用整型来保存结果,会导致结果错误。
如果你使用C++或C语言而且准备使用printf输出结果,则你的格式字符串应该写成**%Ild以输出long long类型的整数。**
#include
int main()
{
int n;
int a[1000];//数组要定范围的
int i, j, k;
int num=0;
// printf("please enter the number of elements in the array:\nn=");
scanf("%d",&n);
// printf("please enter the elements in the array:\n");
for( i=1; i<n; i++)
{
scanf("%d",&a[i]);
}
for( i=1; i<n-2; i++) //对于i j k的循环条件来说,从内层向外层推比较好
{
for( j=i+1; j<n-1; j++)
{
for( k=j+1; k<n; k++)
{
if(a[i]<a[j] && a[j]<a[k] )
{
num+=1;
}
}
}
}
printf("%d",num);
return 0;
}
其中很重要的一点是定义数组的部分。如果将 int a[1000]; 改为 int a[n] 的话,程序就完全不能运行。初步判断,数组长度和题目中给的 【评测用例规模与约定】 有关。
而其中的数组个数能否用变量这对我来说是个一直以来都没有太清楚的搞懂。
以下是变长数组的使用方法
1 . C89标准:不支持变长数组的功能,也就是说数组的长度在编译期就确定,不能在运行期改变。
2 . C99标准: 允许在C语言中使用变长数组。然而,C99定义的这种变长数组的使用是有限制的,不能像在C++等语言中一样自由使用。
1、变长数组必须在程序块的范围内定义,不能在文件范围内定义变长数组;
2、变长数组不能用static或者extern修饰;
3、变长数组不能作为结构体或者联合的成员,只能以独立的数组形式存在;
4、变长数组的作用域为块的范围,对应地,变长数组的生存时间为当函数执行流退出变长数组所在块的时候
在我的编译器中,这样写,整个代码就是可运行的
int n;
int i, j, k;
int num=0;
printf("please enter the number of elements in the array:\nn=");
scanf("%d",&n); //先输入n
int a[n]; //再拿n定义数组
printf("please enter the elements in the array:\n");
for( i=1; i<n; i++)
{
scanf("%d",&a[i]);
}
但这样写整个程序又是不能运行的,但是注意我指的是整个程序不能运行,但经过试验,这几行代码是可以运行的,并且正确。
int n;
int a[n];//先定义数组
int i, j, k;
int num=0;
printf("please enter the number of elements in the array:\nn=");
scanf("%d",&n);//再输入n
以上,就是我个人对这道题目的总结。
主要有两点理不清
1 , 评测用例规模与约定 这个题目条件如何使用,得分点在哪里?
2 , 变长数组到底能不能在程序中使用?
如果有大佬能否,指点一下,感激不尽。