NC248199. 球球大作战
描述
输入描述
第一行输入一个正整数 ,表示玩家的数量。
第二行输入 个正整数,第 个正整数 表示初始化时第 个玩家的球的大小。
输出描述
输出一个长度为 的仅有 '0' 和 '1' 组成的字符串,字符串的第 位为 1 当且仅当存在一种碰撞顺序,使得第 名玩家可以成为最终的胜利者。
示例1
输入:
3 5 7 6
输出:
011
说明:
如下安排碰撞顺序,玩家 可取胜:示例2
输入:
10 729 9 81 19683 1 2187 3 27 243 6561
输出:
1001010011
pypy3 解法, 执行用时: 489ms, 内存消耗: 40872K, 提交时间: 2023-02-11 13:11:23
n=int(input()) A=list(map(int,input().split())) ret=[0]*n # print(ret) num=[] for index,value in enumerate(A): num.append((value,index)) num.sort(key=lambda x:x[0],reverse=True) l=0 r=n-1 def check(x): ret=num[0][0] for i in range(n): if i==x: continue ret=(ret+num[i][0])//2 if num[x][0]>=ret: return True return False while l<r: mid=(l+r+1)//2 if check(mid): l=mid else: r=mid-1 for i in range(l+1): ret[num[i][1]]=1 for i in ret: print(i,end="")
C++(g++ 7.5.0) 解法, 执行用时: 35ms, 内存消耗: 1324K, 提交时间: 2023-02-11 01:23:42
#include<bits/stdc++.h> using namespace std; using i64=long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr);cout.tie(nullptr); int n; cin>>n; vector<int>a(n); for(int i=0;i<n;i++) cin>>a[i]; auto b=a; sort(a.begin(),a.end()); int l=0,r=n-1; while(l<r) { int m=l+r>>1; int s=a[n-1]; for(int i=n-1;i>=0;i--) if(i!=m) s=(s+a[i])/2; if(s<=a[m]) r=m; else l=m+1; } for(int i=0;i<n;i++) { if(b[i]>=a[r]) cout<<1; else cout<<0; } return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 73ms, 内存消耗: 2084K, 提交时间: 2023-05-02 18:55:53
#include<bits/stdc++.h> using namespace std; long long a[100010],b[100010]; int main() { int n;cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; b[i]=a[i]; } sort(a+1,a+n+1); int l=1,r=n; while(r>l) { int mid=(r+l)/2; int ant=a[n]; for(int i=n;i>=1;i--) if(i!=mid) ant=(ant+a[i])/2; if(a[mid]>=ant) r=mid; else l=mid+1; } for(int i=1;i<=n;i++) if(b[i]>=a[l]) cout<<1; else cout<<0; return 0; }