题解 P2660 【zzc 种田】


这题是真呀,我打了一个普通算法一看:

#include
using namespace std;
int main()
{
	unsigned long long x,y;
	unsigned long long ans=0;
	cin>>x>>y;
	while(x!=0&&y!=0)
	{
		unsigned long long k=min(x,y);
        if(k==x) y-=k;
        else x-=k;
        ans+=4*k
	}
	cout<

然后就光荣地TLE了……(手动滑稽)

后来发现,这个算法有很大的剪枝空间,比如样例一,x=1,y=10,这个程序运行时各个变量如下:

x: 1  1 1 1  1  1  1  1  1  1  1

y:10  9 8 7  6  5  4  3  2  1  0

k: /  1 1 1  1  1  1  1  1  1  1

ans:0 4 8 12 16 20 24 28 32 36 40

里面有很多是重复计算的,比如对于这个样例,我们可以这么算:y是x的10/1=10倍,所以这个k只要算出后乘十就行。

代码如下

#include
using namespace std;
int main()
{
	unsigned long long x,y;
	unsigned long long ans=0;
	cin>>x>>y;
	while(x!=0&&y!=0)
	{
		if(x

886各位~