• CF1668A Direction Change


    题目描述:

    有一个 n \times mn×m 的矩阵,现在你在 ( 1,1 )(1,1),你可以朝上、下、左、右四个方向移动,但不可以连续朝某个方向移动,问最少需要移动几次你才可以到达 ( n,m )(n,m),如果无法到达 ( n,m )(n,m),输出 -1−1。

    输入格式:

    第一行一个整数 t ( 1\le t \le 10^3 )t(1≤t≤103),表示有 tt 组询问。

    接下来 tt 行,每行两个整数,表示 nn 和 m ( 1\le n,m \le 10^9 )m(1≤n,m≤109)。

    输出格式:

    对于每一组询问,输出对应的答案。

    说明/提示

    样例第一组询问:不需要移动。

    样例第二组询问:向下移动一次。

    样例第三组询问:不能到达。

    样例第四组询问:有一种可行的解法为 (1,1)\to(1,2)\to(2,2)\to(2,1)\to(3,1)\to(3,2)\to(4,2)(1,1)→(1,2)→(2,2)→(2,1)→(3,1)→(3,2)→(4,2),共 66 步。

    输入输出样例

    输入 #1

    1. 6
    2. 1 1
    3. 2 1
    4. 1 3
    5. 4 2
    6. 4 6
    7. 10 5

    输出 #1

    1. 0
    2. 1
    3. -1
    4. 6
    5. 10
    6. 17

     本题是本蒟蒻在CF题库里做的第一道题,求各位 dalao 支持、纠错;

    原本想要用 广搜 去搜索,但 $(1 \leq n,m \leq 10^9)$ 可能会 超时 (我太弱了)。所以我采用了数学来做。

    数据大体可以分为 4 种情况: 

    1.  当 n==1&&m>=3||m==1&&n>=3 时,无解,输出 -1  。
    2. 当 m==n==1 时,只用输出 0 ,不需要走一步。
    3. 当 m==n 时,可以 阶梯状 去走,只用输出: (n-1)*2=n+m-2 。 
    4. 其余情况,先走到 (n,m) 中小的一个的点,如在 n
    1. #include
    2. using namespace std;
    3. int main(){
    4. int n,m,t;
    5. cin>>t;
    6. while(t--){
    7. cin>>n>>m;
    8. if(n==1&&m==1){
    9. cout<<0<
    10. }else if(n==m){
    11. cout<-2<
    12. }else if(n==1&&m>=3||m==1&&n>=3){
    13. cout<<-1<
    14. }else{
    15. int ans=0;
    16. if(n
    17. ans=n*2+(m-n)/2*4+(m-n)%2-2;
    18. }else{
    19. ans=m*2+(n-m)/2*4+(n-m)%2-2;
    20. }
    21. cout<
    22. }
    23. }
    24. return 0;

  • 相关阅读:
    PCB板中符号的意义
    若依集成sharding-jdbc实现分库分表
    JavaWeb AJAX请求
    怎么使用Consul当配置中心和动态刷新配置
    Java序列化和Json格式的转化
    LeetCode-435-无重叠区间
    PLC维护有何难处?如何实现远程维护?
    MySQL主从复制
    计算机网络那些事之 MTU 篇 pt.2
    ConfigMap挂载与Subpath在Nginx容器中的应用
  • 原文地址:https://blog.csdn.net/Kochakin/article/details/125899145