题意
链接: 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;
}