Lose it! CodeForces - 1176C(好题,思维,前缀递推)

题意:给定一个长度为n的数组,数组的元素只有六种情况,问至少移除多少个元素可以使得这个数组成为好的数组。一个好的数组的定义是:首先这个数组的长度是六的倍数,并且可以由多个:4,8,15,16,23,42的序列组成。注意是序列,不需要连续。,但是相对位置必须保持不变。

题解:好题,只有六个数,我们用一个数组a[6]分别记录{4}{4,8}{4,8,15}....这些情况,当前的前缀必定是由之前的状态递推过来的。

AC代码:

#include 
#include 
#include 
#include 
#include 
#include 
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
const int mod=2147493647;
const int maxn=1e6+5;
int a[maxn];
main() {
	IOS;
	int n;
	cin>>n;
	for(int i=1; i<=n; i++) {
		int x;
		cin>>x;
		if(x==4)a[1]++;
		if(x==8&&a[1]) {
			a[2]++;
			a[1]--;
		}
		if(x==15&&a[2]) {
			a[3]++;
			a[2]--;
		}
		if(x==16&&a[3]) {
			a[4]++;
			a[3]--;
		}
		if(x==23&&a[4]) {
			a[5]++;
			a[4]--;
		}
		if(x==42&&a[5]) {
			a[6]++;
			a[5]--;
		}
	}
	cout<

 

你可能感兴趣的:(ACM_思维,ACM_动态规划,ACM双指针,前缀和,差分数组)