合工大OJ 1344
拿到问题,上来分析,感觉挺简单,不是双重循环就ok了吗?于是,上来就很暴力,直接上代码
#include <stdio.h>
int f(int n,int k)
{
int i,j,d,sum;
d=-1;
sum=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=k;j++)
sum+=d*i;
d*=-1;
}
return sum;
}
int main()
{
int t;
int n,k;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&k);
printf("%d\n",f(n,k));
}
return 0;
}
结果也可以想象,疯狂提交,结果疯狂
百度搜了下,看了下别人的算法
#include<stdio.h>
int main()
{
long long sum,x,y,a,b,i,z;
int n;
scanf("%d",&n);
while(n--)
{
sum=0;
scanf("%I64d %I64d",&a,&b);
x=a/(b*2);//有几组?
y=a%(b*2);//余数
sum+=b*b*x;//加上每组的数!
if(y<=b)
{
sum-=((x*b*2+1+x*b*2+y)*y)/2;
}
else
{
z=b-y;
sum-=((x*b*2+1+x*b*2+b)*b)/2;
sum+=((x*b*2+b+1+a)*(a-x*b*2-b))/2;
}
printf("%I64d\n",sum);
}
return 0;
}
回过头来再看看自己的算法,很明显,之前的错误现在依然存在:
数据大,用long long!
其次,数据大还需要使用等差数列求和。