Comet OJ - Contest #10 沉鱼落雁
Comet OJ - Contest #10 沉魚落雁
題目描述
胖頭魚在苦惱“沉魚落雁”是什么好吃的東西,這很顯然是因為他成語沒背夠。
于是他決定開始背成語。胖頭魚身為魚界大佬,背成語的姿勢自然也和常人不一:
他會先將所有要背的成語一字排開,比較難背的成語會重復(fù)出現(xiàn),最多重復(fù) 33 次 (也就是出現(xiàn)次數(shù)可能為 11, 22 或 33)。這樣就得到了一個可能有重復(fù)元素的成語序列,然后他會將這個序列打亂順序,并按打亂后的順序背下去。為了均勻的背所有成語,提高背成語的效率,相同成語在打亂后的序列中出現(xiàn)位置的最小間隔自然是越大越好。 (編號為 aa 和 bb (a<ba<b) 的兩個位置的間隔定義為 b-a-1b?a?1)
現(xiàn)在胖頭魚把打亂前的成語序列給你,你需要幫他打亂順序,使得相同成語的最小間隔最大。
你不需要輸出確切的方案,僅求出最小間隔的最大值即可。
特別地,當(dāng)每種成語都只出現(xiàn)一次時,把最小間隔的最大值視為nn。
輸入描述
第一行一個整數(shù)n(1<=n<=1e5),表示成語序列長度為 n。同一個成語最在序列中最多出現(xiàn) 3 次。
接下來 n 個整數(shù) a1, a2, ……, an(1<=ai<=1e9) 表示一個成語序列,每個正整數(shù)都代表一個成語,兩個成語不同當(dāng)且僅當(dāng)值不同。
輸出描述
輸出一個整數(shù),表示最小間隔的最大值。
樣例輸入 1
9 5 4 3 1 3 1 1 5 5樣例輸出 1
2樣例解釋 1
其中一組可行方案是1 3 5 1 3 5 1 4 5,容易驗證沒有比 22 更大的答案。
樣例輸入 2
5 1 2 3 4 5樣例輸出 2
5題目一開始很懵,后來發(fā)現(xiàn)最大距離就是個數(shù)為2的種類加個數(shù)為3的種類減1,即:ans=m1+m2-1,個數(shù)為1的種類只需補(bǔ)給m1和m2即可,需特判一下3的種類為0和輸出為n的情況:
#include <bits/stdc++.h> using namespace std; typedef long long ll;int a[100005]; map<int,int>p;//計數(shù) map<int,int>v;//標(biāo)記 int main() {int n;cin>>n;int num=0;int m1=0;//3的種類int m2=0;//2的種類int m3=0;//1的種類for(int i=0;i<n;i++){scanf("%d",&a[i]);if(p.count(a[i])==0) {p[a[i]]=1; num++;v[a[i]]=1;}else p[a[i]]++;}for(int i=0;i<n;i++){if(p[a[i]]==3 && v[a[i]]) {m1++; v[a[i]]=0;}else if(p[a[i]]==2 && v[a[i]]) {m2++; v[a[i]]=0;}else if(p[a[i]]==1 && v[a[i]]) {m3++; v[a[i]]=0;}}if(num==n) cout<<n;else if(m1==0) {cout<<m2+m3-1;}else if(m1){int k=m3/3,i=0,j=0;if(m3==1) {m1++;m2--;}else{for(i=0;i<=k;i++){if((m3-i*3)%2==0){j=(m3-i*3)/2;break;}}m1+=i;m2+=j;}cout<<m1+m2-1;}return 0; }總結(jié)
以上是生活随笔為你收集整理的Comet OJ - Contest #10 沉鱼落雁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高分屏笔记本显示模糊解决方法
- 下一篇: python数字精度自动变化_如何在py