方格行走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时,如下表

12
34
56

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

1234
5678
9101112

写完数以后,你从最左上角出发,每次只能向右或向下走一格(不能走出格子阵),目标是到达最右下角,记所有经过的格子的数字之和为 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 <bits/stdc++.h>
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值