codeforces 1393 B. Applejack and Storages (思维 模拟)

本文介绍了一个关于用不同长度的木板组成特定图形的问题,并提供了一种解决方案。通过使用两个数组来跟踪每种长度木板的数量及其出现频次,可以在一系列添加或移除木板的操作后快速判断是否能形成所需的长方形和正方形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

链接: link.
你需要八块木板,组成一个长方形和一个正方形,正方形可以是长方形,最开始的时候仓库里有n个长度为arr[i]长度的木板;
但此时你并没有购买,有q此操作,每次操作是添加一块长度木板或者减少一块已有的木板,问每次操作之后,你是否能够凑齐两个图形所需要的木板

思路

为了满足条件,我们需要一组四块一样长度的木板,和两组2块一样长度的木板,有四种情况
1、八块木板一样长(1,1,1,1,1,1,1,1)
2、四块木板一样长,另四块木板也一样长(1,1,1,1,2,2,2,2)
3、四块木板一样长,还有另外两组长度不一样长(1,1,1,1,2,2,3,3)
4、六块木板一样长,另外两块一样长(1,1,1,1,1,1,2,2)
我们可以设置两组数组,数组a记录长度为now的木板有多少块,数组b记录木板个数为a[now]的有多少种木板,假如长度为5的木板有4块的话,a[5]=4;题目模拟的过程中,木板是一块一块记录在案的,所以经历了a[5]=1,a[5]=2,a[5]=3,a[5]=4;的过程,所以数组b里面木板个数为1,2,3,4都记录了长度为5的木板的存在历程
模拟题面过程,操作之后判断是否满足四种情况之一

AC代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define N 100005
int main()
{
    int arr[N], brr[N], n, now;
    char x;
    cin >> n;
    while (n--)
    {
        cin >> now;
        arr[now]++;
        brr[arr[now]]++;
    }
    cin >> n;
    while (n--)
    {
        cin >> x >> now;
        if (x == '+')
            arr[now]++, brr[arr[now]]++;
        else
            brr[arr[now]]--, arr[now]--;
        if ((brr[8] > 0) || (brr[4] >= 2) || (brr[4] > 0 && brr[2] >= 3) || (brr[6] > 0 && brr[2] >= 2))
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    //system("pause");
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.0-0.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值