E. New Year Parties
对于最大值 我们显然可以sort之后 贪心一下即可 正确性显然
对于最小值 我们发现会有三种情况 一种是三个挨在一起 一种是两个挨在一起 还有一种就是两个只隔了一个空隙
我们直接dp求解即可
void solve(){
int n;cin>>n;
vector<int>a(n),v(n+1);
for(int i=0;i<n;i++)cin>>a[i],v[a[i]]++;
vector<int>b=a;
sort(all(b));
b.erase(unique(all(b)),b.end());
vector<bool>st(n+1);
int mx=0;
for(auto i:b){
if(!st[i-1]&&v[i]){
mx++;
v[i]--;
st[i-1]=1;
}
if(!st[i]&&v[i]){
mx++;
v[i]--;
st[i]=1;
}
if(!st[i+1]&&v[i]){
mx++;
v[i]--;
st[i+1]=1;
}
}
vector<int>dp(n+10,INF);
a.clear();a.push_back(0);
for(auto i:b)a.push_back(i);
dp[0]=0;
for(int i=1;i<a.size();i++){
dp[i]=min(dp[i],dp[i-1]+1);
if(a[i]==a[i-1]+2&&i>=2)dp[i]=min(dp[i],dp[i-2]+1);
if(a[i]==a[i-1]+1&&a[i-1]==a[i-2]+1&&i>=3)dp[i]=min(dp[i],dp[i-3]+1);
if(a[i]==a[i-1]+1&&i>=2)dp[i]=min(dp[i],dp[i-2]+1);
}
cout<<dp[(int)a.size()-1]<<' '<<mx<<endl;
}
标签:int,611,Codeforces,st,++,&&,Div,mx,dp
From: https://www.cnblogs.com/ycllz/p/16850910.html