2 条题解
-
0
这道题的难点:想到二分
先审一遍题,发现可以这么处理:先造出 个恰好包含 颗珠子的项链,(不难看出这个 就是 )再归还 颗珠子,使得剩下的珠子能够造出最多的恰好包含 颗珠子的项链,设为 。
具体实现:先把所有的 从小到大排序,这样最小值便是 ,将所有的 减去这个最小值,这样 就会变为 ,之后我们就不用管它了。归还 颗珠子的时候,只需要考虑 到 就行了。考虑具体如何归还,注意到, 的最大值其实就是归还完后 到 的最小值,由于具体归还策略比较难考虑,可以二分答案。
下面是代码:
#include<bits/stdc++.h> using namespace std; long long a[59]; long long n; bool flag=0; bool check(long long x,long long sum){ for(long long i=2;i<=n;i++)//check逻辑:如果归还sum颗珠子能够支持再造x个包含n-1颗珠子的项链,返回1,否则返回0 if(a[i]<x) if(x-a[i]>sum) return 0; else sum-=x-a[i]; return 1; } int main(){ scanf("%lld",&n); for(long long i=1;i<=n;i++) scanf("%lld",&a[i]); sort(a+1,a+n+1); long long sum=a[1]; for(long long i=1;i<=n;i++)//先造sum个包含n颗珠子的项链 a[i]-=sum; long long l=0,r=1000000000;//二分上界其实没那么大,不过我懒得改了 while(l+1<r){//二分答案 long long mid=(l+r)>>1; if(check(mid,sum)) l=mid; else r=mid; } printf("%lld\n",l+sum); return 0; }整体复杂度O(nlogn)
信息
- ID
- 278
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 12
- 已通过
- 6
- 上传者