202 1ICPC 上海 M Harmony in Harmony 构造

题意有点绕,大概意思就是,现在你要将2个完全一样的区域都分成n份,且这n份的面积也都相同,我们将每一份区域定一个id(理解为1-n的排列),问怎么分使得这俩个区域,相同id的子区域相交之后的共有的面积,n个共有面积的最小值能取到多少。

题解:我们将题意转化一下,把这俩次划分看成一张二分图,在所有可能的排列中,那么第一次划分的第ii号点和第二次划分的所有可能出现iinn个位置的面积并之和就是1/n,即它自己面积本身。即这是一个满二分图,其中每一个节点,其所连边的权值和为1/n1/n 那么现在我们就将题意转化成了要求寻找⼀个尽可能⼤的ansans,使得在任何满⾜上述条件的⼆分图下,都能够找到⼆分图的完美匹配,使得匹配边的权值都不低于ansans

容易想到一定存在一个ans=1n2ans=\frac{1}{n^2}的构造,但这显然不是最优解。官方题解给了一个很巧妙的思路,我们现在取前tt个白点,将其和前t1t-1个黑点连边,每条边的权值都为1nt\frac{1}{nt},那么显然这t1t-1个黑点的权值已经连完了,而每个白点还剩下1nt\frac{1}{nt}的权值可以连给其它黑点,我们将1nt\frac{1}{nt}平均分给剩下的nt+1n-t+1个黑点,然后这些黑点再和剩下的ntn-t个白点连边,可以发现在所有连边中,最小的权值便为1nt(nt+1)\frac{1}{nt(n-t+1)}

现在尝试证明nt(nt+1)>=n2nt(n-t+1)>=n^2

现在tt是未知数,进行二次函数展开化简后即证明nt2+(n2+n)tn2>=0-nt^2+(n^2+n)t-n^2>=0

进行求根后可得x1=1,x2=2nx1=1,x2=2n,又因为这个函数开口向下,且t[1,n]t\in[1,n],所以证明完毕。

因此对于nt(nt+1)nt(n-t+1)这个函数,所能取到的最大值就是当t=n+12t=\frac{n+1}{2}(对称轴)的时候,因为tt属于整数域,所以当tt为偶数的时候,最大值取不到,要取其左右俩边。综上,该函数的最大值就是nn+12n+22n \lfloor \frac{n+1}{2} \rfloor \lfloor \frac{n+2}{2} \rfloor

对应答案的最小值就是,1nn+12n+22\frac{1}{n \lfloor \frac{n+1}{2} \rfloor \lfloor \frac{n+2}{2} \rfloor},直接输出即可

#include<bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
#define fi first
#define se second
#define set9 fixed<<setprecision(9)
#define set12 fixed<<setprecision(12)
#define set2 fixed<<setprecision(2)
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pii pair<int,int>
#define pll pair<long long,long long>
#define db double
#define rep(i, a, b) for(int i=a;i<=b;i++)
#define per(i, a, b) for(int i=a;i>=b;i--) 
using namespace std;
const int maxn=2e5+5;
const ll mod=1e9+7;
inline ll read(){ ll f = 1; ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch = getchar();}while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0',  ch = getchar();return x*f; }
inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
inline ll Inverse(ll x) { return qpow(x,mod-2);}


int main()
{
    int n;
    cin>>n;
    int t1=(n+1)/2,t2=(n+2)/2;
    double val=n*t1*t2;
    double ans=(1.000000)/val;
    cout<<set9<<ans<<endl;                        
}

全部评论

相关推荐

06-04 18:37
门头沟学院 Java
勇敢的ssr求对象:前面看的有点奔溃,看到只有你是真玩啊,忍不住笑出了声😂
点赞 评论 收藏
分享
牛客928043833号:在他心里你已经是他的员工了
点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务