方格行走
题目描述
给定 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 1⩽T⩽1000, 1 ⩽ n , m ⩽ 1 0 4 1\leqslant n,m\leqslant 10^4 1⩽n,m⩽104
这道题很简单,只要会for循环就会,但是不能把题想的特别难,只要画几次图就可以找到规律(但是不能用DP,因为会TLE):
-
上面第一行永远是值最小的
-
最右边永远是最快捷的可以到达终点的方式
-
结合一下就是把第一行的值和最右边的那一列的值加起来就是答案(记得开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;
}