Codeforces Round #639 (Div. 2) 题解


A - Puzzle Pieces

  • 题意:
    给n*m个拼图,问这些拼图能不能按照n*m的图形拼在一起,要注意拼图的形状构成.

  • 思路:
    1A. 这个题看得比较快,猜了一波结论秒了。
    观察图形的话就可以发现:只有在拼图块拼成一行时才能无限延伸,或者2*2大小互相衔接,因为2*2的话已经将这些缺口用完,所以就是极限情况了。

int main()
{
    IOS;
    int T;
    cin >> T;
    while (T--)
    {
        int n, m;
        cin >> n >> m;
        if (n == 1 || m == 1)
        {
            cout << "YES" << endl;
        }
        else
        {
            if (n == 2 && m == 2)
                cout << "YES" << endl;
            else
                cout << "NO" << endl;
        }
    }
    return 0;
}

B - Card Constructions

  • 题意:
    给n个木棒,要搭成金字塔的形状,每次搭的金字塔要求是当前还剩余木棒能搭的最大高度,问最多能搭出来几个金字塔。

  • 思路:
    2A。写了一波tle,以为是时间的问题,乱改了一波又交万万没想到居然re了。。。
    纯暴力的思路,直接把1e9+7能搭出来的高度先纯一下(大概26000个),然后暴力的将n带入,每次取大能搭的高度,直到n<=1。

ll vis[260000];

void init()
{
    ll cnt = 2, x = 2;
    ll t = 0;
    while (cnt <= 10000000007)
    {
        vis[t++] = cnt;
        cnt += (x * 2 + x - 1);
        x++;
    }
}

int main()
{
    IOS;
    ll T;
    cin >> T;
    init();
    while (T--)
    {
        ll n;
        cin >> n;
        ll flag = 1, ans = 0;
        while (flag)
        {
            for (ll i = 0;; i++)
            {
                if (vis[i] <= n && vis[i + 1] > n)
                {
                    ll t = n / vis[i];
                    n = n % vis[i];
                    ans += t;
                    break;
                }
                if (vis[i] > n)
                {
                    flag = 0;
                    break;
                }
            }
        }
        cout << ans << endl;
    }
    return 0;
}

C - Hilbert's Hotel

  • 题意:
    现在有很多顾客编号为【0,正无穷】,再给出一个数组An;然后对于每一个顾客k,把它移到 第(k+a[k%n])的房间,问会不会出现有一个房间存在两个人,

  • 思路:
    这题实属阅读理解题嗷,毒瘤死了
    对于非负整数k (0 <= k <= +∞),对k做 (k+a[k%n])的变换,判断变换后是否会出现相同的数字;
    可以发现只要0 ~ n-1之内的k变换后没有出现相同的数字,那么大于k的数字变换后也不会出现相同的数字;所以只需要对0 ~ n-1的数进行模拟即可;

const int N = 2e5;
int a[N];
map<int, int> mp;
int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        mp.clear();
        int flag = 1;
        int n;
        cin >> n;
        for (int i = 0; i < n; i++)
            cin >> a[i];
        for (int i = 0; i < n; i++)
        {
            int x = ((i + a[i]) % n + n) % n;
            if (mp[x])
            {
                flag = 0;
                break;
            }
            mp[x]++;
        }
        if (flag)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
}

D - Monopole Magnets

  • 题意:
    给你一幅图,‘#’代表黑格,‘.’代表白格,让你在满足以下条件的情况下计算出最少的需要摆放的指北针数,若无解则输出-1

1:每行每列必须至少有一枚指南针

2:指北针能到达所有的黑格

3:指北针不能到达任何一个白格

如果指北针所在的行和列存在指南针,指北针可以向指南针的方向移动;

  • 思路:
    无解情况一:如果每行或每列中的任意两个黑格之间存在白格
    原因如下:
  1. 若两个黑格所在的块中都有一枚指南针,那么当指北针在其中一块时,肯定会被另一块的指南针所吸引,从而到达白格,违背了条件3。

  2. 若黑格中全都摆放指北针,如果不违背条件1,那么必须在白格摆放指南针,那么指北针还是能到达白格,违背条件3.

  3. 若在一个黑块中全都摆放指北针,另一个黑块中摆放指南针,同样会违背条件.

    无解情况二:有全为白格的行(列)但无全为白格的列(行)

    这种情况下无论在空行白格处任何地方放指南针都会吸引黑色格子里的指北针到达白格

    判断好这两种情况后,只需要dfs求联通块个数即可。

const int N = 1e3 + 5;
int n, m;
string maze[N];
int vis[N][N];

int check1()//查行/列是否存在两个黑格子直接有白格的
{
    int fl, fr, fb;
    for (int i = 0; i < n; i++)
    {
        fl = 0, fr = 0, fb = 0;
        for (int j = 0; j < m; j++)
        {
            if (!fl && maze[i][j] == '#')
                fl = 1;
            else if (!fb && fl && maze[i][j] == '.')
                fb = 1;
            else if (maze[i][j] == '#' && fl && fb)
                return 0;
        }
    }
    for (int i = 0; i < m; i++)
    {
        fl = 0, fr = 0, fb = 0;
        for (int j = 0; j < n; j++)
        {
            if (!fl && maze[j][i] == '#')
                fl = 1;
            else if (!fb && fl && maze[j][i] == '.')
                fb = 1;
            else if (maze[j][i] == '#' && fl && fb)
                return 0;
        }
    }
    return 1;
}
int flag2 = 0, flag3 = 0;//flag2为行 flag3为列
void check2()//查是否存在行/列有全为白格的
{
    int bh = 1, bl = 1;
    for (int i = 0; i < n; i++)
    {
        bh = 1;
        for (int j = 0; j < m; j++)
        {
            if (maze[i][j] == '#')
                bh = 0;
        }
        if (bh)
            flag2 = 1;
    }
    for (int i = 0; i < m; i++)
    {
        bl = 1;
        for (int j = 0; j < n; j++)
        {
            if (maze[j][i] == '#')
                bl = 0;
        }
        if (bl)
            flag3 = 1;
    }
}
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
void dfs(int x, int y)
{
    if (x < 0 || x >= n || y < 0 || y >= m || maze[x][y] == '.' || vis[x][y])
        return;
    vis[x][y] = 1;
    for (int i = 0; i < 4; i++)
    {
        int nx = x + dx[i], ny = y + dy[i];
        dfs(nx, ny);
    }
}

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        cin >> maze[i];
    int flag1 = check1();
    check2();
    if (flag1 && flag2 == flag3)//满足两个条件,就查联通块的数量
    {
        int ans = 0;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (maze[i][j] == '#'&&!vis[i][j])
                        dfs(i, j), ans++;
            }
        }
        cout << ans;
    }
    else
        cout << "-1";
    return 0;
}

全部评论

相关推荐

程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-29 15:00
教授A:“你为什么要讲这么久,是要压缩我们对你的评议时间吗?你们别以为这样就能够让我们对你们少点意见。”&nbsp;“从你的发言和论文格式就能知道你的性格啊。”…….&nbsp;感觉被狠狠霸凌了。
码农索隆:“教授您好,首先我想回应您提出的两点疑问。” “关于我讲解时间较长的问题:这绝非为了压缩各位老师的评议时间。这份毕业设计是我过去几个月倾注了全部心血的作品,从构思、实验、调试到撰写,每一个环节都反复打磨。我深知时间宝贵,所以选择详细讲解,是希望能更完整、清晰地展示它的核心创新点、实现过程和验证结果,确保老师们能充分理解它的价值和我的努力。我完全理解并重视评审环节的意义,也做好了充分准备来听取各位老师的专业意见和批评。几个月的研究都坚持下来了,我怎么可能害怕老师们的点评呢?今天站在这里,正是抱着虚心学习、诚恳求教的态度而来。” “如果我的展示确实超时,影响了后续流程,烦请老师们随时示意,我会立刻调整。我非常期待并预留了充足的时间,希望能听到老师们宝贵的建议和深入的讨论。” “其次,关于您提到‘从发言和论文格式就能知道我的性格’。教授,我对此感到非常困惑和不安。学术研究和答辩的核心,难道不应该是作品本身的质量、逻辑的严谨性、数据的可靠性和结论的合理性吗?论文格式有明确的规范要求,我尽最大努力遵循了这些规范。如果格式上存在疏忽或不足,这属于技术性、规范性的问题,恳请老师们具体指出,我一定认真修改。但将格式问题或个人表达风格(如讲解时长)直接上升为对个人性格的评判,甚至以此作为质疑我学术态度和动机的依据,这让我感到非常不公平,也偏离了学术评议应有的客观和严谨原则。” “我尊重每一位评审老师的专业权威,也衷心希望能得到老师们对我的工作内容本身的专业指导和批评指正。任何基于研究本身的意见,无论多么尖锐,我都会认真聆听、反思并改进。但我恳请老师们,能将评议的焦点放在我的研究本身,而不是对我个人进行主观的推断或评价。谢谢各位老师。”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务