C. Lose it!(思维)Codeforces Round #565 (Div. 3)

原题链接: https://codeforces.com/contest/1176/problem/C

在这里插入图片描述
测试样例

input
5
4 8 15 16 23
output
5
input
12
4 8 4 15 16 8 23 15 16 42 23 42
output
0
input
15
4 8 4 8 15 16 8 16 23 15 16 4 42 23 42
output
3

题意: 给你一个长度为 n n n的数组,其中的元素只由 4 , 8 , 15 , 16 , 23 , 42 4,8,15,16,23,42 4,8,15,16,23,42组成。问你至少需要移除多少元素才能使得这个数组变为好数组。
好数组的标准为:其数组长度 k k k必须要是 6 6 6的倍数且有 k 6 \frac{k}{6} 6k个子序列: 4 , 8 , 15 , 16 , 23 , 42. 4,8,15,16,23,42. 4,8,15,16,23,42.

解题思路: 模拟操作即可,要知道起决定性因素的一定是子序列个数,因为数组长度已经被子序列个数确定了,不用管。我们模拟的过程中一定要记住前面的元素是否存在,如果不存在这个子序列也就不存在。模拟操作具体看AC代码。

AC代码

/*
*邮箱:[email protected]
*blog:https://me.csdn.net/hzf0701
*注:文章若有任何问题请私信我或评论区留言,谢谢支持。
*
*/
#include<bits/stdc++.h>	//POJ不支持

#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair

using namespace std;

const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e5;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll>  pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为自定义代码模板***************************************//

int n;
int main(){
    
    
	//freopen("in.txt", "r", stdin);//提交的时候要注释掉
	IOS;
	while(cin>>n){
    
    
		//4,8,15,16,23,42
		int cnt[6]={
    
    0};
		vector<int> v(n+1);
		map<int,int> p;
		rep(i,1,n){
    
    
			cin>>v[i];
			if(v[i]==4){
    
    
				cnt[0]++;
			}
			else if(v[i]==8&&cnt[0]){
    
    
				cnt[0]--;
				cnt[1]++;
			}
			else if(v[i]==15&&cnt[1]){
    
    
				cnt[2]++;
				cnt[1]--;
			}
			else if(v[i]==16&&cnt[2]){
    
    
				cnt[3]++; 
				cnt[2]--;
			}
			else if(v[i]==23&&cnt[3]){
    
    
				cnt[4]++;
				cnt[3]--;
			}
			else if(v[i]==42&&cnt[4]){
    
    
				cnt[4]--;
				cnt[5]++;
			}
		}
		cout<<n-6*cnt[5]<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/hzf0701/article/details/108875980