尽量写的高质量一点,只写有意义的题目。
C
可以像题解一样 通过二分来解决本题,这里提供一个 桶+双指针 的解法。
先将书的序号排序,将相同的放在最后(unique 函数),用桶维护共有哪些书,两个指针分别维护从前面读了几本书 和 从后面换了几本书,每次模拟换书的过程需要更新桶数组。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,a[N],tong[N];
signed main()
{
cin>>n;
for(int i=1;i<=n;++i)cin>>a[i];
sort(a+1,a+n+1);unique(a+1,a+n+1);
for(int i=1;i<=n;++i)if(a[i]<=n)tong[a[i]]++;
int i,hav=0,lst=n;
for(i=1;i<=n;++i)
{
if(tong[i]){hav++;continue;}
if(hav>lst-2)break;
if(a[lst]<=n)tong[a[lst]]--;
if(a[lst-1]<=n)tong[a[lst-1]]--;
lst-=2;
}
cout<<i-1;
return 0;
}