ACM------求和(合工大OJ 1344)

本文对比了一种暴力求解算法与一种高效的等差数列求和算法,通过具体实例展示了如何针对大规模数据进行优化处理,并强调了使用long long类型变量的重要性。

拿到问题,上来分析,感觉挺简单,不是双重循环就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!

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

靓仔很忙i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值