zoukankan      html  css  js  c++  java
  • [COCI2015]ZMIJA

    题目大意:
      一个$n imes m(n,mleq1000)$的格子中有若干金币,从左下角出发,每一步可以进行如下操作:
        1.向当前方向前进一格;
        2.向上移动一步,并调转当前方向。
      一开始的方向是向右,到达一个格子时自动收集当前位置的金币,移动过程中不能离开网格图。
      问收集完所有金币至少需要多少步?

    思路:
      贪心。
      首先记录下每一行最左/最右的金币的位置,每次贪心地取完这一行的所有金币,
      然后判断上一行最左/最右的金币是否在当前方向上,
      如果是,就先往前走到那个位置上,然后再上去,否则就直接上去。

    #include<cstdio>
    #include<cctype>
    inline int getint() {
        register char ch;
        while(!isdigit(ch=getchar()));
        register int x=ch^'0';
        while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
        return x;
    }
    inline bool isblock(const char &ch) {
        return ch=='.'||ch=='J'||ch=='Z';
    }
    inline bool getblock() {
        register char ch;
        while(!isblock(ch=getchar()));
        return ch=='J';
    }
    inline int sign(const int &x) {
        if(x>0) return 1;
        if(x<0) return -1;
        return 0;
    }
    const int N=1001;
    int cnt[N],pos[N][2],sum;
    bool map[N][N];
    int main() {
        const int n=getint(),m=getint();
        for(register int i=1;i<=n;i++) {
            for(register int j=1;j<=m;j++) {
                map[i][j]=getblock();
                if(map[i][j]) {
                    if(!pos[i][0]) pos[i][0]=j;
                    pos[i][1]=j;
                    cnt[i]++;
                    sum++;
                }
            }
        }
        int ans=0;
        for(register int x=n,y=1,d=1;;x--,d=-d) {
            if(map[x][y]) {
                cnt[x]--;
                sum--;
            }
            while(cnt[x]) {
                ans++;
                y+=d;
                if(map[x][y]) {
                    cnt[x]--;
                    sum--;
                }
            }
            if(!sum) break;
            while(pos[x-1][(bool)~d]&&sign(pos[x-1][(bool)~d]-y)==d) {
                y+=d;
                ans++;
            }
            ans++;
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    代码中日志的使用
    MySQL数据库(3)----设置和使用自定义变量
    MySQL数据库(2)----检索信息
    MySQL数据库(1)----入门级操作
    Apache服务器运维笔记(6)----目录 文件 网络容器的安全问题
    Apache服务器运维笔记(5)----容器的处理顺序
    CentOS7 下安装 SublimeText3
    Apache服务器运维笔记(4)----服务器扩展部分
    Apache服务器运维笔记(3)----容器部分
    KMP算法的一个简单实现
  • 原文地址:https://www.cnblogs.com/skylee03/p/8420948.html
Copyright © 2011-2022 走看看