zoukankan      html  css  js  c++  java
  • sgu 109 Magic of David Copperfield II

        这个题意一开始没弄明白,后来看的题解才知道这道题是怎么回事,这道题要是自己想难度很大……

        你一开始位于(1,1)这个点,你可以走k步,n <= k < 300,由于你是随机的走的, 所以你具体在那个格子不确定, 但你可以删掉一些你肯定不在的格子,然后你再走,再删,直到只剩下一个格子。

        真是不知道怎么想出来的,所以没办法写思路了,直接写答案好了。

        我们把格子黑白染色, 如果走奇数步,那么所位于的格子一定和上一个格子颜色不同。 所以我们可以利用这个性质,不断把所在的格子往左上角赶。怎么做到的呢?一开始我们走n步,那么此时一定有一些格子由于距离太远达不到,删掉。注意,此时我们不能立刻删去和此时你所在格子颜色不同的所有格子,如果那样下一步就没法走了,但是,此刻剩下的不止一个格子。 假设此时位于黑色格子,那么再走奇数步,此时一定位于白色格子,那么位于此时图的最下部的黑色格子一定没有你,删掉。诸如此类,直到只剩下(1,1)这个格子。

        这样可能有些难于理解,画一个图就清晰了。

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #define N 100
    #define M 5010
    using namespace std;
    
    struct sss
    {
        int num, place;
    }ask[M];
    int n, K;
    int ans[M];
    bool pd[N]={0};
    
    bool cmp(sss x, sss y)
    {
        if (x.num == y.num) return x.place < y.place;
        else return x.num < y.num;
    }
    
    int calc(int now)
    {
        int a = 0;
        while (now)
        {
            a += now % 10;
            now /= 10;
        }
        return a;
    }
    
    int main()
    {
        scanf("%d%d", &n, &K);
        for (int i = 1; i <= K; ++i)
        {
            scanf("%d", &ask[i].num);
            ask[i].place = i;
        }
        sort(ask+1, ask+K+1, cmp);
        int num = 0, nowask = 1;
        int lastnum = 0;
        for (int i = 1; i <= n; ++i)
        {
            if (!pd[i%64])
            {
                num++;
                while (num == ask[nowask].num)
                {
                    ans[ask[nowask].place] = i;
                    nowask++;
                }
            }
            pd[i%64] = 0;
            if (i % 10 == 0)
            {
                lastnum = calc(i);
                pd[(lastnum+i) % 64] = 1;
            }
            else
            {
                lastnum++;
                pd[(lastnum+i) % 64] = 1;
            }
        }
        printf("%d
    ", num);
        for (int i = 1; i < K; ++i)
            printf("%d ", ans[i]);
        printf("%d
    ", ans[K]);
        return 0;
    }
  • 相关阅读:
    【郑轻邀请赛 G】密室逃脱
    【郑轻邀请赛 C】DOBRI
    【郑轻邀请赛 F】 Tmk吃汤饭
    【郑轻邀请赛 I】这里是天堂!
    【郑轻邀请赛 B】base64解密
    【郑轻邀请赛 A】tmk射气球
    【郑轻邀请赛 H】 维克兹的进制转换
    解决adb command not found以及sdk环境配置
    adb shell 命令详解,android, adb logcat
    Unexpected exception 'Cannot run program ... error=2, No such file or directory' ... adb'
  • 原文地址:https://www.cnblogs.com/handsomeJian/p/3764495.html
Copyright © 2011-2022 走看看