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;
    }
  • 相关阅读:
    golang 数据结构 优先队列(堆)
    leetcode刷题笔记5210题 球会落何处
    leetcode刷题笔记5638题 吃苹果的最大数目
    leetcode刷题笔记5637题 判断字符串的两半是否相似
    剑指 Offer 28. 对称的二叉树
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 26. 树的子结构
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 24. 反转链表
    剑指 Offer 22. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/handsomeJian/p/3764495.html
Copyright © 2011-2022 走看看