咋写那么长?
因为他把二分单独写了个函数
WA0pts
#include<bits/stdc++.h>
using namespace std;
int n;
int cnt;//赢得次数
long long a[100005];
long long sum[100005];
bool cmp(long long x,long long y){
return x<y;
}
bool win(int ii){//判断编号为ii的队伍是否能获胜
long long now=sum[ii];
for(int j=ii+1;j<=n;j++){
if(now>=a[j]){
now+=a[j];
continue;
}
return 0;
}
return 1;
}
void fen_2(){
int l=1;
int r=n;
while(l<r){
int mid=(l+r)/2;//假设有mid个队伍能获胜,则意味着获胜范围为n-mid+1,n
if(win(n-mid+1)){//如果这个范围中魔法值最低的队伍也能获胜
r=mid;
}
else{
l=mid+1;
}
}
cout<<l<<endl;
if(l*2>=n){
cout<<"YES";
}
else{
cout<<"NO";
}
}
int main(){
//freopen("game.in","r",stdin);
//freopen("game.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
if(n==1){
cout<<1<<endl;
cout<<"YES";
return 0;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+a[i];
}
/*
for(int i=1;i<=n;i++){
cout<<win(i)<<endl;
}
*/
fen_2();
return 0;
}
/*
*/
请格式化
我来抢解决了
不要直接输出 l ,输出 n-l+1
这个写错了,因为你二分的是能获胜的队伍数量,所以应该是:
if(win(n-mid+1)){//如果这个范围中魔法值最低的队伍也能获胜
l=mid;
}
else{
r=mid-1;
}
然后前面的应该是:
int mid=(l+r+1)/2;
还是0
#include<bits/stdc++.h>
using namespace std;
int n;
int cnt;//赢得次数
long long a[100005];
long long sum[100005];
bool cmp(long long x,long long y){
return x<y;
}
bool win(int ii){//判断编号为ii的队伍是否能获胜
long long now=sum[ii];
for(int j=ii+1;j<=n;j++){
if(now>=a[j]){
now+=a[j];
continue;
}
return 0;
}
return 1;
}
void fen_2(){
int l=1;
int r=n;
while(l<r){
int mid=(l+r)/2;//假设有mid个队伍能获胜,则意味着获胜范围为n-mid+1,n
if(win(n-mid+1)){//如果这个范围中魔法值最低的队伍也能获胜
r=mid;
}
else{
l=mid+1;
}
}
cout<<n-l+1<<endl;
if(l*2>=n){
cout<<"YES";
}
else{
cout<<"NO";
}
}
int main(){
//freopen("game.in","r",stdin);
//freopen("game.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
if(n==1){
cout<<1<<endl;
cout<<"YES";
return 0;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+a[i];
}
/*
for(int i=1;i<=n;i++){
cout<<win(i)<<endl;
}
*/
fen_2();
return 0;
}
/*
*/
他二分的是能获胜的队伍数量
把win(n-mid+1)
改为 win(n)
哦不对是 win(mid)
为啥?是对的啊
说了他二分的是能获胜的队伍数量
点击这里
方向错了
能获胜队伍的数量是单调递减不是单调递增
我这边是能过的