题目描述:
解题思路:
题目解读:大概意思是输入一个数组a[i],然后如果a[i]=i,那这个数组是good。
如果这个数组中某个子数组是good,那他是beautiful。
输出是判断输入的数组是不是beautiful数组。
该题的第一个输入是数组个数t<500,数组长度n<100,数组数值大小到了10^9?(不明白怎么这么大)
其实问题很简单,只要 数字i出现的位置 >= i 就行,比如1出现在数组1,2,3,4,...位,都能满足[1]是good;2出现在2,3,4,...位,都能满足[x,2]是good,等等。
i出现的位置等于i时,满足了ai=i的要求,就能得到good就必然有beautful。
i出现的位置大于i时,那子数组必然能满足ai=i,子数组能得到good,也能得到beautiful。
代码实现:先输入数组num,然后遍历数组,只要 i - num[i] >= 0 ,那就YES,遍历完都不满足,那就NO。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#define MAX 100000
using namespace std;
void Solve() {
int n;
int num[MAX];
scanf("%d", &n);
for (int i = 1; i <= n; ++i) //输入数组
{
scanf("%d", &num[i]);
}
for (int i = 1; i <= n; ++i) //遍历比较
{
if (i - num[i] >= 0) {
puts("YES");
return;
}
}
puts("NO");
}
int main(){
int t;
scanf("%d", &t);
while (t--) {
Solve();
}
return 0;
}
优化思路:不用等到输入完所有数字,再进行遍历,采用在线处理的思想。
循环输入数然后直接做判断,满足要求,flg赋1,不满足则flg不变,最后根据flg来判断输出。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
using namespace std;
void Solve() {
int n;
scanf("%d", &n);
int num;
int flg = 0;
for (int i = 1; i <= n; ++i)
{
scanf("%d", &num);
if (num <= i) {
flg = 1;
}
}
printf("%s\n", flg == 1 ? "YES":"NO");
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
Solve();
}
return 0;
}
遇到的错误:数组越界。
这里数组定义长度为n的时候,要先输入n,然后才能定义数组大小为n。
把这里的int ch[n];和scanf("%d",&n);位置互换一下即可。