返回顶部

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

  • 题意:给你一串只含\(4,8,15,16,23,42\)的序列,如果它满足长度是\(6\)的倍数并且有\(\frac {k}{6}\)个子序列是\([4,8,15,16,23,42]\),则定义它是好的,问最少删除多少元素使得序列是好的.

  • 题解:我们开个桶(要离散化)记录这些数字出现的次数,然后线性遍历,当遇到\(4\),我们就直接让它++,否则判断它的前一个数的次数是否大于\(0\),如果是,那么它的前一个数的次数--,它自己次数++,如果前一个数出现的次数为\(0\),那么当前这个数就不能构成我们想要的序列,直接报废,最后我们可以得到满足条件的序列个数\(cnt[6]\),序列中含有\(6\)个数,所以最后要删去的元素个数就为\(n-6*cnt[6]\).

  • 代码:

    int n;
    int p[N];
    int a[N];
    int cnt[N];
     
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        cin>>n;
        p[4]=1,p[8]=2,p[15]=3,p[16]=4,p[23]=5,p[42]=6;
        for(int i=1;i<=n;++i) cin>>a[i];
    	for(int i=1;i<=n;++i){	
    		if(a[i]==4) cnt[1]++;
    		if(cnt[p[a[i]]-1]){
    			cnt[p[a[i]]-1]--;
    			cnt[p[a[i]]]++;
    		}
    	}
     
    	cout<<n-6*cnt[6]<<endl;
     
        return 0;
    }
    
posted @ 2020-10-14 13:04  _Kolibri  阅读(117)  评论(0)    收藏  举报