首页 > 解决方案 > 为什么这无效,但在本地有效?— codeforces 中的国王种族问题

问题描述

有人可以帮助新的 C++ 学习者吗?

我正在尝试在https://codeforces.com/contest/1075/problem/A解决国王的比赛问题

问题定义:

白王位于点 (1,1),黑王位于由第一个输入定义的点,即 (n,n)。第一个输入还定义了电路板尺寸。

接下来的两个输入定义了两个国王将比赛的点,第一个到达该点的国王获胜。自然白王总是先走。然而,在这个问题中,国王可以站在相邻的单元格中,甚至可以同时站在同一个单元格中。

预期输出应该是赢得比赛的国王的颜色。

问题是在提供输入时719386363530333627 620916440917452264 265151985453132665

预期的输出是黑色的,我可以确认这是在本地运行代码,但是当通过 codeforces 测试集运行代码时,它无法通过输出白色来给出正确的答案。

这是我的代码:

#include <iostream>

using namespace std;

int main(){
     // take inputs
     long long board_length;
     long long price_coordinate_x;
     long long price_coordinate_y;

     cin >> board_length;
     cin >> price_coordinate_x;
     cin >> price_coordinate_y;

     // starting points for kings
     int white_x = 1;
     int white_y = 1;
     long long black_x = board_length;
     long long black_y = board_length;

     // Difference between price coordinate points
     long long point_difference_white = labs(price_coordinate_x-price_coordinate_y); 
     long long point_difference_black = labs(price_coordinate_x-price_coordinate_y);

     // if x > y => y will be the first value we'll reach
     if (price_coordinate_x > price_coordinate_y) {
          point_difference_white += labs(white_x-price_coordinate_y);
          point_difference_black += labs(black_x-price_coordinate_x); 
     }
     else if (price_coordinate_x < price_coordinate_y) {
          point_difference_white += labs(white_x-price_coordinate_x);
          point_difference_black += labs(black_y-price_coordinate_y);
     }
     else {
          point_difference_white += labs(white_x-price_coordinate_x);
          point_difference_black += labs(black_x-price_coordinate_x);
     }

     if (point_difference_black >= point_difference_white) {
          cout << "White" << endl;
     }
     else if (point_difference_black < point_difference_white) {
          cout << "Black" << endl;
     }
     return 0;
}

标签: c++

解决方案


您使用std::labs()which 使用long整数。
long目标系统上,整数很可能是 32 位。

这意味着您的 64 位long long变量不会得到值的正确结果。

获得正确结果的简单方法是使用std::llabs().

您可能还需要考虑使用具有固定宽度的类型,例如std::int64_t- 或使用最大的有符号整数:std::intmax_t.

<cinttypes>声明这些abs函数std::intmax_t

std::intmax_t abs( std::intmax_t n );
std::intmax_t imaxabs( std::intmax_t n );

推荐阅读