本文主要是介绍小苯的九宫格,小苯的好数组(排序),小苯的数字合并(字典树,前缀和),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
小苯的九宫格
题目描述
运行代码
#include<iostream>
using namespace std;
int main(){int a[10];for(int i=1;i<=9;i++){cin>>a[i];} string b;cin>>b;for(int i=0;i<b.size();i++){int p=b[i]-'0';cout<<a[p];}
}
代码思路
-
定义数组:首先,定义了一个整型数组
a
,用于存储10个整数。但需要注意的是,在C++中,数组的索引通常从0开始,而不是从1开始。然而,这里的循环是从1开始的,这意味着数组的第一个元素a[0]
没有被使用。 -
输入数组:通过一个
for
循环,从a[1]
到a[9]
输入9个整数。这意味着a[0]
的值是未定义的(可能包含垃圾值)。 -
输入字符串:接着,代码读取一个字符串
b
。 -
处理字符串并输出数组元素:再次使用一个
for
循环遍历字符串b
的每一个字符。- 在循环内,首先将字符
b[i]
转换为其对应的整数p
。这是通过从字符中减去字符'0'的ASCII值来实现的。在ASCII中,数字字符'0'到'9'是连续的,所以这种减法可以得到字符所代表的整数值。 - 然后,代码尝试输出数组
a
中索引为p
的元素。但是,由于之前的数组输入是从1开始的,如果b
中的某个字符表示的数字是0(即p
为0),则程序会尝试访问a[0]
,这是一个未定义的值。此外,如果b
中的某个字符表示的数字大于9(即p
大于9),则程序会访问数组a
的越界位置,这会导致未定义行为(通常是程序崩溃)
- 在循环内,首先将字符
小苯的好数组(排序)
题目描述
运行代码
#include<iostream>
#include<vector>
using namespace std;
inline int FN(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int a[200010];
signed main(){int n=FN();for(int i=1;i<=n;i++)a[i]=FN();bool o=0;for(int i=1;i<=n;i++)o|=(a[i]<a[i-1]);if(o)cout<<n<<endl;else cout<<0;return 0;
}
代码思路
-
FN 函数:
这是一个用于读取整数的函数,它可以处理正数和负数。- 首先,它初始化一个整数
x
为 0 和一个标志f
为 1(用于处理负数)。 - 然后,它读取一个字符
c
并检查它是否是数字。如果不是,它会继续读取直到找到数字或负号。 - 如果找到负号,它将
f
设置为 -1。 - 接下来,它会读取所有的数字字符,并将它们转换为整数。
- 最后,它返回
x * f
,这样如果f
是 -1,那么x
就会被取反。
- 首先,它初始化一个整数
-
主函数:
- 首先,它使用
FN
函数读取一个整数n
,表示要读取的整数数量。 - 然后,它使用一个
for
循环读取n
个整数并存储在数组a
中。注意,这里从a[1]
开始存储,但数组通常从a[0]
开始。 - 接下来,它使用一个布尔变量
o
来跟踪数组是否是降序的。它初始化为false
(在C++中,bool
类型的0
被视为false
)。 - 它再次使用一个
for
循环遍历数组,并检查每个元素是否小于其前一个元素。如果是,它将o
设置为true
。但是,这里有一个潜在的问题:当i=1
时,a[i-1]
实际上是a[0]
,而a[0]
没有被初始化或赋值,这可能导致未定义的行为。 - 最后,根据
o
的值,它输出n
或0
。
- 首先,它使用
小苯的数字合并(字典树,前缀和)
题目描述
运行代码
#include <bits/stdc++.h>
#include<iostream>
using namespace std;
int main()
{int n;cin>>n;int a[200005];long long sum[200005];sum[0]=0;for(int i=1;i<=n;i++){cin>>a[i];sum[i]=sum[i-1]+a[i];}long long ans=0;if(n==1){return 0;}long long m=1e9;for(int i=1;i<=n;i++){if(a[i]<m){m=a[i];}ans=max(sum[n]-sum[i]-m,ans);ans=max(sum[i-1]-a[i],ans);}cout<<ans;return 0;
}
代码思路
-
输入与初始化:输入整数
定义数组n
,表示序列的长度。定义数组a[200005]
存储序列中的每个元素。sum[200005]
用于存储序列的累积和,其中sum[i]
表示序列前i
个元素的和。初始化sum[0]=0
。 -
读取序列与计算累积和:读取序列中的每个元素
a[i]
,并计算累积和数组sum
,使得sum[i] = sum[i-1] + a[i]
。 -
寻找分割点以最大化“不完美度”:
- 初始化变量
ans
为0,用于记录最大的“极差”。 - 用一个变量
m
来追踪到目前为止序列中的最小值,初始值设为1e9
(一个很大的数,确保任何正整数都会比它小)。 - 遍历序列,对于每个位置
i
(从1到n):更新m
为当前位置i
处的元素a[i]
和当前最小值m
中的较小者。计算两种分割情况下的“不完美度”:第一种情况:分割点在i
,左边部分的不完美度为当前m
,右边部分的不完美度由累积和计算得来,即sum[n] - sum[i] - m
。- 第二种情况:实际上是一种特例,当分割点在
i
左侧的最后一个位置时,左边所有元素的总和减去a[i]
。 - 更新
ans
为上述两种情况中的较大值。
- 第二种情况:实际上是一种特例,当分割点在
- 初始化变量
-
输出结果:循环结束后,
ans
中存储了最大的“差”,将其输出。
这篇关于小苯的九宫格,小苯的好数组(排序),小苯的数字合并(字典树,前缀和)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!