社区讨论

萌新跪求大佬们赐教!!!

P11272 「Diligent-OI R1 B」DlgtArray参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhk7b63y
此快照首次捕获于
2025/11/04 14:41
4 个月前
此快照最后确认于
2025/11/04 14:41
4 个月前
查看原帖
各位大佬们好,菜鸟萌新这题怎么写也不对,并且对样例#2也有疑惑,想求各位大佬赐教。下面是我的思路和代码,求各位大佬批评指点。

思路

由于数组全为101、0,所以连乘只会有两种结果,当被节选子数组全为11时,连成结果为1,否则全为00
  1. 当连乘结果为11时,累加结果为rl+1r-l+1,结果满足
rl+1=k+1=>rl=kr-l+1=k+1 => r-l=k
  1. 当连乘结果为0时,累加结果为第ll位到第rr位的范围组成的子数组内11的数量。可知,在子数组内,共rl+1r-l+1个数,设其中11mm个,那么
km=需要变换成10的个数k-m=需要变换成1的0的个数
  1. 当出现子数组内所有值全为11却无法达到kk的值得时候,该查询无解,即
rl+1<k时,无论如何变化均无法满足条件r-l+1<k时,无论如何变化均无法满足条件
按照上面的思路,我的代码如下:

代码

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 条回复,欢迎继续交流。

正在加载回复...