社区讨论
萌新跪求大佬们赐教!!!
P11272 「Diligent-OI R1 B」DlgtArray参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mhk7b63y
- 此快照首次捕获于
- 2025/11/04 14:41 4 个月前
- 此快照最后确认于
- 2025/11/04 14:41 4 个月前
各位大佬们好,菜鸟萌新这题怎么写也不对,并且对样例#2也有疑惑,想求各位大佬赐教。下面是我的思路和代码,求各位大佬批评指点。
思路
由于数组全为,所以连乘只会有两种结果,当被节选子数组全为时,连成结果为1,否则全为。
- 当连乘结果为时,累加结果为,结果满足
- 当连乘结果为0时,累加结果为第位到第位的范围组成的子数组内的数量。可知,在子数组内,共个数,设其中有个,那么
- 当出现子数组内所有值全为却无法达到的值得时候,该查询无解,即
按照上面的思路,我的代码如下:
代码
C#include<iostream>
using namespace std;
int main(){
//处理输入
int n,q;
cin>>n>>q;
int* a = new int[n];
int** qList = new int*[q];
int * rList = new int[q];
for (int i = 0; i < n; i++)
{
cin>>a[i];
}
for (int i = 0; i < q; i++)
{
rList[i]=0;
int* aQ = new int[3];
for (int h = 0; h < 3; h++)
{
cin>>aQ[h];
}
qList[i] = aQ;
}
//处理逻辑部分
for (int i = 0; i < q; i++)
{
int ans = 0;
if (qList[i][1]-qList[i][0]+1<qList[i][2])//思路中无解的情况,即第3点
{
ans = -1;
}
else
{
if (qList[i][1]-qList[i][0]==qList[i][2])//全1解
{
for (int j = qList[i][0]; j <= qList[i][1]; j++)
{
if (a[j-1]==0)//计算把当前子数组内所有0全变成1的操作次数
{
ans++;
}
}
}
else//子数组中部分值变成1的情况
{
int m = 0;
for (int j = qList[i][0]; j <= qList[i][1]; j++)
{
if (a[j-1]==1)//计算当前数组中已经已经有多少1
{
m++;
}
}
ans = qList[i][2]-m;//计算需要把子数组中多少个0变成1
}
}
printf("%d\n",ans);
}
return 0;
}
感谢大佬们看完,希望大佬们指点一下问题所在
ps:这次是第一次参加比赛,跪求大佬们指点一下应该怎么提升编码能力和算法思维
回复
共 4 条回复,欢迎继续交流。
正在加载回复...