小苯的九宫格
题目描述
运行代码
#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
中存储了最大的“差”,将其输出。