倒搜
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define F(III,MMM,NNN) for(register int III=MMM;III<=NNN;III++)
typedef long long int ll;
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3f
#define re register
const int N=1010,
mod=10000007;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//对于当前人最后一场比赛拿第一名,\
积累分最高的人拿第n名\
第二高的人拿n-1名\
判断当前人能否拿到最后的第一名
int n;
int a[300010]={};
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=0;
sort(a+1,a+n+1,greater<int>());
for(int i=1;i<=n;i++){
int k=0,f=1;
for(int j=1;j<=n;j++){
if(j!=i){
k++;
if(a[j]+k>a[i]+n){
f=0;
break;
}
}
}
if(f){
ans++;
}else{
break;//大的不行小的一定不行
}
}
cout<<ans;
return 0;
}
正搜
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define f(III,MMM,NNN) for(int III=MMM;III<=NNN;III++)
typedef long long int ll;
ll a[300010]={};
const int N=1010;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//对于当前人最后一场比赛拿第一名,\
积累分最高的人拿第n名\
第二高的人拿n-1名\
判断当前人能否拿到最后的第一名
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1,less<ll>());
ll ans=0;
for(int i=1;i<=n;i++){
bool f=0;
int c=0;
a[i]+=n;
for(int j=n;j>=1;j--){
if(j!=i){
c++;
a[j]+=c;
if(a[j]>a[i]){
f=1,a[j]-=c;
break;
}
a[j]-=c;
}
}
a[i]-=n;
if(f==0){
ans+=n-i+1;
break;
}
}
cout<<ans;
return 0;
}