【题解】回家

题目描述

  在一个二维坐标系里,某人要从原点(0,0)走到整点(P,Q)。他可以走“正步”和“斜步”。“正步”是指他向水平方向走一步或者向垂直方向走一步。“斜步”是指他朝45度角的方向走一步。下面用数学形式来描述“正步”和“斜步”。不妨假设某人目前的位置在整点(x,y),那么他走1步“正步”可以到达的整点是:(x+1,y)或(x-1,y)或(x,y+1)或(x,y-1)。他走1步“斜步”可以到达的整点是:(x+1,y+1)或(x+1,y-1)或(x-1,y+1)或(x-1,y-1)。他每走1步“正步”需要消耗W能量,每走1步“斜步”需要S能量。某人要从原点(0,0)走到整点(P,Q),至少需要多少能量?

输入格式

  多组测试数据。
  第一行,一个整数R,表示有R组测试数据。 1<=R<=9。
  每组测试数据格式如下:
     一行,四个整数:P,Q,W,S。  0<=P,Q<=10^9。    1<=W,S<=10000。

输出格式

  共R行,每行一个整数。

输入样例

9
4 2 3 10
4 2 3 5
2 0 12 10
1000000 1000000 1000 1000
0 0 12 25
25 18 7 11
25 18 7 6
24 16 12 10
1000000000 1000000000 10000 10000

输出样例

18
16
20
1000000000
0
247
151
240
10000000000000

题解

  如下面这张图所示:

扫描二维码关注公众号,回复: 5957917 查看本文章

  容易想到,我们要尽可能走正步或尽可能走斜步,易得:当$2 \times W \leqslant S$时,答案为$(P+Q) \times W$,否则答案为$Q \times S + (P-Q) \times W$(这里假定$P \geqslant Q$)。

  但真的那么简单吗?

  观察图像得知,走两次斜步可以等同于走两次正步的效果,再次进行分析,可以补充出第三种情况下的答案:当$W>S$时,答案为$Q \times S + [P - Q - (P - Q) mod 2] \times S + [(P - Q) mod 2] \times W$。

#include <iostream>

using namespace std;

int G;
long long p, q, w, s;

int main()
{
    cin >> G;
    while(G--)
    {
        cin >> p >> q >> w >> s;
        if(p < q) swap(p, q);
        if(w > s) cout << q * s + (p - q & ~1) * s + (p - q & 1) * w << "\n";
        else if(2 * w > s) cout << q * s + (p - q) * w << "\n";
        else cout << (p + q) * w << "\n"; 
    }
    return 0;
}
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10742028.html