题目链接:Educational Codeforces Round 24 F. Level Generation
题意:
给你n个点,让你构造ans条边,使得这ans条边中至少有一半是桥。
让你求ans的最大值。
题解:
首先我们将每一个点按顺序连起来,那么可以构成n-1个桥。
然后我们可以把其中的x个点拿出来连边,这些边都不是桥。
x个点最多能连x*(x-1)条边,然后剩下的n-x个点连的边将会构成桥。
然后就可以构造一个函数关系,详见check函数,然后三分一下就行了。
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=(a);i<=(b);++i) 3 using namespace std; 4 typedef long long ll; 5 6 int q; 7 ll n,ans; 8 9 ll check(ll mid) 10 { 11 ll tmp=(mid*mid-mid)/2; 12 if(n-mid>=tmp)return tmp+n-mid; 13 else if(n-mid>=mid-1)return (n-mid)*2; 14 else return mid-1; 15 } 16 17 int main(){ 18 scanf("%d",&q); 19 while(q--) 20 { 21 scanf("%I64d",&n); 22 ll l,r,mid,mmid; 23 for(l=1,r=n;l<r-1;) 24 { 25 mid=l+r>>1,mmid=mid+r>>1; 26 if(check(mid)>check(mmid))r=mmid; 27 else l=mid; 28 } 29 printf("%I64d\n",max(check(l),max(check(r),check(1)))); 30 } 31 return 0; 32 }
时间: 2024-10-12 12:26:49