zoukankan      html  css  js  c++  java
  • CodeForces 1176C

    You are given an array a consisting of n integers. Each ai is one of the six following numbers: 4,8,15,16,23,42.

    Your task is to remove the minimum number of elements to make this array good.

    An array of length k is called good if k is divisible by 6 and it is possible to split it into k6 subsequences 4,8,15,16,23,42.

    Examples of good arrays:

    [4,8,15,16,23,42] (the whole array is a required sequence);
    [4,8,4,15,16,8,23,15,16,42,23,42] (the first sequence is formed from first, second, fourth, fifth, seventh and tenth elements and the second one is formed from remaining elements);
    [] (the empty array is good).
    Examples of bad arrays:

    [4,8,15,16,42,23] (the order of elements should be exactly 4,8,15,16,23,42);
    [4,8,15,16,23,42,4] (the length of the array is not divisible by 6);
    [4,8,15,16,23,42,4,8,15,16,23,23] (the first sequence can be formed from first six elements but the remaining array cannot form the required sequence).

    Input

    The first line of the input contains one integer n (1≤n≤5⋅105) — the number of elements in a.

    The second line of the input contains n integers a1,a2,…,an (each ai is one of the following numbers: 4,8,15,16,23,42), where ai is the i-th element of a.

    Output

    Print one integer — the minimum number of elements you have to remove to obtain a good array.

    Examples

    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个整数组成的数组a。每个ai是以下六个数字之一:4、8、15、16、23、42。

    您的任务是删除使该数组良好的最小元素数。
    长度k的数组称为good,如果k可被6整除,并且可以将其拆分为k6子序列4、8、15、16、23、42。

    良好数组的示例:

    [4,8,15,16,23,42](整个数组是必需的序列);

    [4,8,4,15,16,8,23,15,16,42,23,42](第一个序列由第一、第二、第四、第五、第七和第十个元素构成,第二个序列由剩余元素构成);

    [](空数组很好)。
    坏数组的示例:

    [4,8,15,16,42,23](元素的顺序应该正好是4,8,15,16,23,42);

    [4,8,15,16,23,42,4](数组的长度不能被6整除);

    [4,8,15,16,23,42,4,8,15,16,23,23](第一个序列可以由前六个元素构成,但剩余的数组不能构成所需的序列)。

    输入

    输入的第一行包含一个整数n(1≤n≤5⋅105)——a中的元素数。

    输入的第二行包含n个整数a1、a2、…、an(每个a i是以下数字之一:4、8、15、16、23、42),其中ai是a的第i个元素。

    输出
    打印一个整数-要获得一个好的数组,必须删除的最小元素数。

    题目大意:

    给出一个数组,数组内的元素都由 4 8 15 16 23 42 组成,良好的数组是4 8 15 16 23 42 依次数过去(可以不连续),并且良好的数组一定是6的倍数,求要想让当前数组成为良好的数组至少要删除几个元素。

    解题思路:

    这个题用 O(n) 的方法去求解,要使良好的数组成立,必须使这6个数依次出现,可以不连续,我用map依次映射4 8 15 16 23 42 为1-6,用ans[]表示良好数组中这些数的出现次数,即ans中的数都是已经添加在良好数组中的数。
    如果输入的是4时 ans[mp[4]]++,如果不是,则要判断比他小的那一个数出现次数是不是大于当前数,如果是才能++。
    比如:要想把15这个数添加到良好数组中,数组中必须要已经有4和8。即前面的数出现次数高于这个数时才能++,如果能顺利加到 42 ,则说明良好序列的数量+1,最后输出n-ans[6]*6的值即可。AC代码:

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <map>
    using namespace std;
    map<int ,int >mp;
    int ans[10]={0};
    int main()
    {
    	mp[4]=1;
    	mp[8]=2;
    	mp[15]=3;
    	mp[16]=4;
    	mp[23]=5;
    	mp[42]=6;
    	int n;
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	{
    		int a;
    		cin>>a;
    		if(mp[a]==1)
    		  ans[mp[a]]++;
    		else if(ans[mp[a]-1]>ans[mp[a]])//如果输入的不是4,则判断一下上一个数的出现次数是否比当前数要多
    		  ans[mp[a]]++;
    	}
    	cout<<n-6*ans[6]<<endl;
    	//system("pause");
    	return 0;
    }
    
  • 相关阅读:
    go install
    web网络安全系统
    Web图片分享系统
    web图库网站
    web视频播放网站
    web商业银行管理平台
    web科技管理信息平台
    web工艺品销售平台
    web房产网站
    感谢!
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294252.html
Copyright © 2011-2022 走看看