3 条题解

  • 0
    @ 2025-10-30 19:21:26
    #include <stdio.h>
    int main(){
        int n,m,sum=0;
        scanf("%d",&n);
        while(n--){
            scanf("%d",&m);
            char s[200009];
            scanf("%s",s);
            int i=0,cnt1=0,cnt2=0;
            while(i<m){
                if(s[i]=='-'){
                    cnt1++;
                    i++;
                    //printf("cnt1=%d ",cnt1);
                }else{
                    cnt2++;
                    i++;
                    //printf("cnt2=%d ",cnt2);
                }
            }
            if(cnt1%2==1){
                sum=cnt1/2*(cnt1/2+1)*cnt2;
            }else{
                sum=cnt1/2*cnt1/2*cnt2;
            }
            printf("%d\n",sum);
        }
    }
    
    • 0
      @ 2025-10-28 11:00:17

      若` - `个数为 cnt1,` _ ` 个数为cnt2, 要想让`-_-`的个数最多,

      显而易见我们要让 ` - `安置在左右两边,假设左边L个右边R个,然后中间都是` _ `才能最优。Ans = l * r * cnt2

      数学规律:当l和r尽可能接近时,l × r的乘积最大(和固定时,两数越接近乘积越大)。因此取 l = cnt1 // 2,r = cnt1 - l,即可得到最大的l × r,进而得到最大的 “-_-” 次数。

    • 0
      @ 2025-10-27 0:40:08
      #include<stdio.h>
      typedef long long ll;
      const int N=1e6+5;
      const ll inf=1e18;
      ll t,n,d;
      char s[N];
      int main(){
          scanf("%lld",&t);
          while(t--){
              scanf("%lld",&n);
              scanf("%s",s);
              ll c1=0,c2=0;
              for(int i=0;i<n;i++){
                  if(s[i]=='-') c1++;
              }
              c2=n-c1;
              ll ans=0;
              if(c1%2==0){
                  ans=(c1/2)*(c1/2)*c2;
              } 
              else{
                  ans=(c1/2)*((c1+1)/2)*c2;
              }
              printf("%lld\n",ans);
              //右边写成c1+1是防止奇数时漏情况
              //例如,c1=5,c1/2=2,(c1+1)/2=3;
          }
          return 0;
      }
      
      
      • 1

      信息

      ID
      1163
      时间
      1000ms
      内存
      256MiB
      难度
      6
      标签
      递交数
      126
      已通过
      40
      上传者