合工大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
",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
",sum);  
	    }  
	    return 0;
	}

回过头来再看看自己的算法,很明显,之前的错误现在依然存在:

数据大,用long long!

其次,数据大还需要使用等差数列求和。


原文地址:https://www.cnblogs.com/wangxueliang/p/9346481.html