POJ 3902 The Bad Number第一次积分赛K题
·
第一次积分赛的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;
}
更多推荐
所有评论(0)