zoukankan      html  css  js  c++  java
  • UOJ136 开学前的作文

    描述

    红包是一个萌萌的男孩子。

    红包由于 NOI 惨挂,直到前不久依然无心写作业。如今快开学了,他决定好好完成作业。

    对于可以交电子稿的作文,红包有特殊的完成技巧,大致流程是依次选中一段内容→按下 Ctrl+C→按下 Ctrl+V

    由于红包的键盘过于奇特,只有 Fn55 个按键能够移动光标,导致每次选中一段内容总要费上一番功夫。

    按键功能
    将光标向上移动一格
    将光标向下移动一格
    将光标向左移动一格
    将光标向右移动一格
    Fn 依次按下最近被物理按下的两个
    例子:若依次按下 FnFn,则第一次按下 Fn 后等价于按下 ,第二次按下 Fn 后等价于依次按下

    现在红包想要在按键次数尽可能少的情况下移动光标到第 nn 行第 mm 列。为了简化问题我们默认光标起始位置为第一行第一列。

    输入格式

    第一行一个正整数 TT,表示数据组数。

    接下来 TT 行,每行两个正整数 n,mn,m,如题所述,表示光标的目标位置。

    每组数据之间相互独立。

    输出格式

    对于每一个询问,输出一行一个整数 ansans,表示最小按键次数。

    样例一

    input

    2
    1 5
    3 3
    

    output

    3
    3
    

    explanation

    对于第一组输入,我们要将光标移至第一行第五列,依次按 Fn,即可。

    对于第二组输入,依次按下 Fn,即可。

    正解:模拟

    解题报告:

      一道UER的题目居然搞了我这么久,醉了。。。  

      显然n==1 或者 m==1特判一下水过去。考虑二者均不为1的情况,首先肯定尽可能地每次走一个往右下的路线,所以可以算出能往右下走多远,然后就转换成了n==1 或者 m==1的情况了。

     1 //It is made by jump~
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <algorithm>
     8 #include <ctime>
     9 #include <vector>
    10 #include <queue>
    11 #include <map>
    12 #include <set>
    13 #ifdef WIN32   
    14 #define OT "%I64d"
    15 #else
    16 #define OT "%lld"
    17 #endif
    18 using namespace std;
    19 typedef long long LL;
    20 int ans;
    21 
    22 inline int getint()
    23 {
    24        int w=0,q=0;
    25        char c=getchar();
    26        while((c<'0' || c>'9') && c!='-') c=getchar();
    27        if (c=='-')  q=1, c=getchar();
    28        while (c>='0' && c<='9') w=w*10+c-'0', c=getchar();
    29        return q ? -w : w;
    30 }
    31 /*
    32 inline int solve(int x){    
    33     int ans;
    34     if(x<=1) return 0;
    35     else if(x<=2) ans=1;
    36     else if(x<=3) ans=2;
    37     else ans=2+(x-2)/2;
    38     return ans;
    39 }*/
    40 
    41 inline void work(){
    42     int T=getint(); int x,y; 
    43     while(T--) {
    44     x=getint(); y=getint(); ans=0;
    45     if(x>y) swap(x,y); x--; y--;
    46     if(x==0) {
    47         if(y<=1) ans=y;//特判只能走一次
    48         else ans=1+(y+1)/2;
    49     }
    50     else {
    51         ans=x;//共x次
    52         y=y-x+1;
    53         if(y<=1) ans+=y;
    54         else ans+=(y+1)/2+1;
    55     }
    56     /*
    57     if(x==1 && y==1) ans=0; 
    58     else if(x==1) ans=solve(y);                                                                                                    
    59     else{
    60         now=min(x-1,y-1);
    61         ans=2; ans+=now-1; x-=now; y-=now;
    62         ans+=solve(y);
    63         }*/
    64     printf("%d
    ",ans);
    65     }
    66 }
    67 
    68 int main()
    69 {
    70   work();
    71   return 0;
    72 }
  • 相关阅读:
    MessageDigest简介
    深入入门正则表达式(java)
    JAVA 正则 Pattern 和 Matcher
    理解Servlet过滤器 (javax.servlet.Filter)
    Java 之 I/O 系列 01 ——基础
    finally块中的代码一定会执行吗?
    wait(), notify(),sleep详解
    Java 多线程——基础知识
    集合迭代时对集合进行修改抛ConcurrentModificationException 原因 以及解决方案
    深入理解ServletRequest与ServletResponse
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/5816251.html
Copyright © 2011-2022 走看看