第一次积分赛的K题,比赛的时候一直在搞这个题目,n,m,k。结果是TLE,WA都没有WA成功,后来下来分析,题目并没有自己想的那样简单。

      题目地址:The Bad Number

/* 
  自己的代码硬是过不了,找各种数据,开始以为m=1不能拆分但是可以拆分为1. 
  自己的分类: 
     n=1或者m=1 
     k=1 
     n=2时m分奇偶 
     n==3时 k分余1余2 
     n>3时 
  不过,解题报告分类跟我第一次想差不多,再找最后一个的时候暴力找出来,看是否可以匹配。 
     尤其是再k定了以后找到m余数m0不为0的时候,先res++,如果res%n==0,直接再加一次res,就OK了。 
     
*/  
  
#include<cstdio>  
#include<cmath>  
using namespace std;  
int main()  
{  
    int T,i;  
    scanf("%d",&T);  
    while(T--)  
    {  
        int n,m,k;  
        int res=0;  
        scanf("%d%d%d",&n,&m,&k);  
        //if(k>m)  
           //k=m-1;  
        if(k%n==0)  
           k--;  
        if(n==1)  
        {  
            puts("-1");       //n为1的时候绝对不可以  
        }  
          else if(k==1)    //把k放在最前面讨论,以免到n==3时候讨论进入for循环,花费时间  
          {  
               if(m%n==0)  
                    puts("-1");  
                 else  
                    printf("%d\n",m);  
          }  
           else if(n==2)  
          {  
             if(!(m&1))         //表示m%2==0  
             {  
                 puts("-1");    //偶数不可能是奇数个奇数相加  
             }  
              else  
              {  
                  res=m/k;  
                  m=m%k;  
                  if(m>0)  
                    res++;  
                  if(res%2==0)  
                    res++;  
                  printf("%d\n",res);  
              }  
          }  
           else   //n>2,k>1  
           {  
               res=m/k;  
               m=m%k;  
               /*if(m==0) 
               { 
                    if(res%n==0) 
                         res++; 
                    printf("%d\n",res); 
               } 
                else if(m%n!=0) 
                { 
                    res++; 
                    if(res%n==0) 
                         res++; 
                    printf("%d\n",res); 
                } 
                 else 
                 { 
                     if(n>3)     //写成m了 
                     { 
                        if(k==m+1) 
                          res++; 
                        if(res%n==0) 
                           res++; 
                        printf("%d\n",res); 
                     } 
                      else if(k%3==2)   //m==3此种情况最为复杂 
                      { 
                           if(res%n==0) 
                              res++; 
                           printf("%d\n",res); 
                      } 
                       else    //k%3==1  不好弄 
                       { 
                            if(k==m+1) 
                              res++; 
                            if(res%n==0) 
                              res++; 
                            printf("%d\n",res); 
                       }*/  
            if(m>0)  
            {  
                res++;  
                if(res%n==0)  
                   res++;     //这样一步直接省略了很多,扩展一项,不再考虑  
                  else if(m%n==0)  
                 {  
                    if(res==1)    //针对k>n的情况  
                       res=2;     //最多是2  
                    else if((k-1)%n==0)  
                    {  
                        int flag=0;  
                        for(i=1;i<n&&i<k-m;i++)  
                            if((m+i)%n!=0&&(k-i)%n!=0)  
                            {  
                                   flag=1;  
                                   break;  
                            }  
                        //如果falg=1说明找到了k可以和最后一个数凑成两个不是n的倍数的数  
                        if(flag==0)  
                        {  
                            res++;  
                            if(res%n==0)  
                            {  
                                   res++;  //因为找不到不成倍的数,已经拆分了,而且因为项数成倍还需要继续拆分  
                            }  
                        }  
                    }  
                  }  
  
             }  
  
             printf("%d\n",res);  
          }  
     }  
    return 0;  
}  


Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐