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