Educational Codeforces Round 24 F. Level Generation(三分)

题目链接: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
",max(check(l),max(check(r),check(1))));
30     }
31     return 0;
32 }
View Code
原文地址:https://www.cnblogs.com/bin-gege/p/7112644.html