1. 程式人生 > 實用技巧 >Codeforces Round #565 (Div. 3) C. Lose it! (思維)

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;
    }