方格行走c++

方格行走

题目描述

给定 n n n m m m列的方格阵,从最左上角的格子开始,从左向右在每个格子中写数 1 , 2 , 3 , . . . 1,2,3,... 1,2,3,...,一行写完了以后就在下一行继续写,例如 n = 3 , m = 2 n=3,m=2 n=3,m=2时,如下表

1 2
3 4
5 6

又如 n = 3 , m = 4 n=3,m=4 n=3,m=4时,如下表

1 2 3 4
5 6 7 8
9 10 11 12

写完数以后,你从最左上角出发,每次只能向右或向下走一格(不能走出格子阵),目标是到达最右下角,记所有经过的格子的数字之和为 S S S(包括起点和终点),请问 S S S最小可能为多少?

输入格式

第一行一个整数 T T T,表示测试数据的组数

接下来 T T T行,每行两个整数 n n n m m m

输出格式

T T T行,每行一个整数,表示答案

样例 #1

样例输入 #1

7
1 1
2 3
3 2
7 1
1 10
5 5
10000 10000

样例输出 #1

1
12
13
28
55
85
500099995000

提示

对于 100 % 100\% 100%的数据, 1 ⩽ T ⩽ 1000 1\leqslant T\leqslant 1000 1T1000 1 ⩽ n , m ⩽ 1 0 4 1\leqslant n,m\leqslant 10^4 1n,m104

这道题很简单,只要会for循环就会,但是不能把题想的特别难,只要画几次图就可以找到规律(但是不能用DP,因为会TLE):

  1. 上面第一行永远是值最小的

  2. 最右边永远是最快捷的可以到达终点的方式

  3. 结合一下就是把第一行的值和最右边的那一列的值加起来就是答案(记得开long long)

核心代码如下:

long long sum=0;
for(int i=1;i<=end;i++)
{
	sum+=i;
}
for(int i=2;i<=first;i++)	//这里1的部分重叠,要从2开始
{
	sum+=i*end;
}
printf("%lld\n",sum);

完整代码如下:

#include 
using namespace std;
int main()
{
	long long t;
	scanf("%lld",&t);
	while(t--)
	{
		long long sum=0;
		long long first,end;
		scanf("%lld%lld",&first,&end);
		for(long long i=1;i<=end;i++)
		{
			sum+=i;
		}
		for(long long i=2;i<=first;i++)
		{
			sum=sum+i*end;
		}
		printf("%lld\n",sum);
	}
	return 0;
}

你可能感兴趣的:(luogu题,c++,算法,开发语言,数据结构,数论)