比赛的时候写得太乱了,二分+双指针一起上实在有点多余,双指针也写得有点冗余。主要还是理解复杂了题目,不仔细看输入范围不带语境的后果╮(╯▽╰)╭
然后今天又把两个分开写了一下:
【二分版】
#include<iostream>
#include<algorithm>
#include<string>
#include<map>//int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0};
#include<set>//int gcd(int a,int b){return b?gcd(b,a%b):a;}
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
using namespace std;
vector<int> v;
int main(){
int t;
scanf("%d",&t);
while(t--){
v.clear();
int n,m,p=0;
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i){
int a;
scanf("%d",&a);
if(a==0)
p++;
else
v.push_back(a);
}
if(p==n){
cout<<min(m,p)<<endl;
continue;
}
sort(v.begin(),v.end());
n=unique(v.begin(),v.end())-v.begin();
int l=0,r=m;
int ans;
while(l<=r){
int mid=(l+r)/2;
int u=0;
for(int i=0;i<n-max(mid-p,0)+1;++i){
int a=i,b=i+max(mid-p,0)-1;
if((v[b]-v[a]+1)-(b-a+1)<=p){
u=1;
break;
}
}
if(u==0)
r=mid-1;
else{
l=mid+1;
ans=mid;
}
}
cout<<ans<<endl;
}
return 0;
}
【双指针版】
#include<iostream>
#include<algorithm>
#include<string>
#include<map>//int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0};
#include<set>//int gcd(int a,int b){return b?gcd(b,a%b):a;}
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
using namespace std;
vector<int> v;
int main(){
int t;
scanf("%d",&t);
while(t--){
v.clear();
int n,m,p=0;
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i){
int a;
scanf("%d",&a);
if(a==0)
p++;
else
v.push_back(a);
}
if(p==n){
cout<<min(m,p)<<endl;
continue;
}
sort(v.begin(),v.end());
n=unique(v.begin(),v.end())-v.begin();
int a=0,b=0;
int maxx=0;
while(b<n){
if((v[b]-v[a]+1)-(b-a+1)>p){
a++;
continue;
}
int ss=p-((v[b]-v[a]+1)-(b-a+1));
int sss=min(m,ss+(v[b]-v[a]+1));
maxx=max(maxx,sss);
b++;
}
cout<<maxx<<endl;
}
return 0;
}