TopCoder SRM461C: FencingGarden 题解

Topcoder SRM 499 的第一道题,如果对topcoder还不是很了解的可以拿来看看 你可以通过这道题去了解Topcoder的题目以及比赛形式 立即下载

我们首先可以发现一个性质:因为只会有两个小段是被切出来的,而篱笆有三条边,所以必然有一条边是由未被切割的篱笆构成的
我们设这条边的长度为x,所有篱笆的长度和为s,有两种情况
1. 这条边与墙平行,则面积S=xs−x2=−12x2+12sxS=xs−x2=−12x2+12sx
2. 这条边与墙垂直,则面积S=x(s−2x)=−2x2+sxS=x(s−2x)=−2x2+sx
我们发现两种情况都是二次函数的形式,所以在顶点取到最大值
又因为x一定是整数,所以我要找的是用现在的这些木棍能拼出的小于顶点横坐标的最大值和大于顶点横坐标的最小值
考虑到n≤40n≤40,可以用一种很套路的折半搜索解决这个问题
我们先2n2n枚举前二十个边,把所有可能的长度和存进一个set,然后再2n2n枚举后二十条边,在set里面lower_bound一下就好了

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <utility>
#include <cctype>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <cmath>
#define LL long long
#define LB long double
#define x first
#define y second
#define Pair pair<int,int>
#define pb push_back
#define pf push_front
#define mp make_pair
#define LOWBIT(x) x & (-x)
using namespace std;

const int MOD=1e9+7;
const LL LINF=2e16;
const int INF=2e9;
const int magic=348;
const LB eps=1e-10;
const LB pi=3.14159265;

inline int getint()
{
    char ch;int res;bool f;
    while (!isdigit(ch=getchar()) && ch!='-') {}
    if (ch=='-') f=false,res=0; else f=true,res=ch-'0';
    while (isdigit(ch=getchar())) res=res*10+ch-'0';
    return f?res:-res;
}

class FencingGarden
{
    LL sum,csum,llim,rlim;
    int a[48],b[48],atot,btot,n;
    set<LL> s;set<LL>::iterator iter;
    LB maxarea,curarea;
    LL maxlen,curlen;
    inline void check_max(LB curarea,LL curlen)
    {
        if (!curarea || !curlen) return;
        if (curarea>maxarea) {maxarea=curarea;maxlen=curlen;return;}
        if (curarea==maxarea) {maxlen=max(maxlen,curlen);}
    }
    inline void Clear()
    {
        atot=btot=0;
        sum=0;maxlen=maxarea=0;s.clear();
    }
    public:
        inline LL computeWidth(vector<int> segment)
        {
            int i,Mask;n=int(segment.size());Clear();
            for (i=0;i<int(segment.size());i++) sum+=segment[i];
            for (i=0;i<=n-1;i++) if (i<=n/2-1) a[++atot]=segment[i]; else b[++btot]=segment[i];
            for (Mask=0;Mask<=(1<<atot)-1;Mask++)
            {
                csum=0;
                for (i=1;i<=atot;i++) if (Mask&(1<<(i-1))) csum+=a[i];
                s.insert(csum);
            }
            if (sum%2==1) llim=sum/2,rlim=sum/2+1; else llim=rlim=sum/2;
            for (Mask=0;Mask<=(1<<btot)-1;Mask++)
            {
                csum=0;
                for (i=1;i<=btot;i++) if (Mask&(1<<(i-1))) csum+=b[i];
                LL nsum=llim-csum;iter=s.lower_bound(nsum);
                if (iter!=s.end() && (*iter)==nsum) {curlen=csum+(*iter);check_max((LB)(-(LB)curlen*curlen+(LB)sum*curlen)*1.0/2,curlen);}
                else if (iter!=s.begin()) {curlen=csum+(*(--iter));check_max((LB)(-(LB)curlen*curlen+(LB)sum*curlen)*1.0/2,curlen);}
                nsum=rlim-csum;iter=s.lower_bound(nsum);
                if (iter!=s.end())
                {
                    curlen=csum+(*iter);check_max((LB)(-(LB)curlen*curlen+(LB)sum*curlen)*1.0/2,curlen);
                }
            }
            if (sum%4==0) llim=rlim=sum/4; else llim=sum/4,rlim=sum/4+1;
            for (Mask=0;Mask<=(1<<btot)-1;Mask++)
            {
                csum=0;
                for (i=1;i<=btot;i++) if (Mask&(1<<(i-1))) csum+=b[i];
                LL nsum=llim-csum;iter=s.lower_bound(nsum);
                if (iter!=s.end() && (*iter)==nsum) {curlen=csum+(*iter);check_max((LB)(-2)*curlen*curlen+(LB)sum*curlen,sum-2*curlen);}
                else if (iter!=s.begin()) {curlen=csum+(*(--iter));check_max((LB)(-2)*curlen*curlen+(LB)sum*curlen,sum-2*curlen);}
                nsum=rlim-csum;iter=s.lower_bound(nsum);
                if (iter!=s.end())
                {
                    curlen=csum+(*iter);check_max((LB)(-2)*curlen*curlen+(LB)sum*curlen,sum-2*curlen);
                }
            }
            return maxlen;
        }
};

/*---Debug Part---*/
/*int main ()
{
    FencingGarden A;
    int nn;
    while (scanf("%d",&nn)!=EOF)
    {
        vector<int> vv;int x;
        while (nn--) x=getint(),vv.pb(x);
        cout<<A.computeWidth(vv)<<endl;
    }
    return 0;
}*/
激光SLAM算法性能对比:在Ubuntu20.04上实测Point-LIO/FAST_LIO2/Faster-LIO的运行效果 本文在Ubuntu 20.04平台上对Point-LIO、FAST-LIO2和Faster-LIO三款激光SLAM算法进行了深度实测与性能对比。通过量化分析绝对轨迹误差、CPU/内存占用及单帧处理延迟等核心指标,结合室内外场景数据,为高精度测绘、服务机器人及自动驾驶等不同应用场景提供了清晰的选型指南和实战调优建议。 阅读详情

相关推荐

电磁波成像技术全解析:从γ射线到无线电波的应用实践

本文全面解析电磁波成像技术,从γ射线到无线电波的应用实践。详细介绍了不同波长电磁波的特性与实用场景,包括医疗影像、工业检测、安防监控等领域。特别探讨了X射线、红外热成像、毫米波雷达等前沿技术的实战应用,为读者提供技术选型指南和操作技巧。

weixin_29305337的博客 293

Topcoder好题推荐

转自白神:http://hi.baidu.com/%B0%D7%D2%C2%C9%D9%C4%EA2012/blog/item/d2a1a43291acbe3c0a55a9b7.html  Single Round MatchSRM 522 DIV1   1050pt ( 很不错的dp题,先需要思考来分析各种情况 ) 推荐代码: practice room writerSRM 521 DIV1 ...

weixin_33726318的博客 420

PaddleOCR多进程GPU推理实战:200万图片高效处理方案

本文详细介绍了PaddleOCR多进程GPU推理在高效处理200万张图片OCR任务中的实战方案。通过优化GPU利用率、多进程并发和关键参数调优,实现了从单进程3000张/小时到8进程3万张/小时的性能飞跃,为大规模OCR处理提供了可靠解决方案。

prometheus9mon的博客 261

TopCoder SRM194C: IslandFerries 题解

十分坑爹,题目中写的是“当你用完一张票到其他岛屿上时,你的手中只能有0,1,2张票,所以事实上任意时刻你的手上最多能有3张票 考虑状压dp dp[i][Mask]表示当前在i号岛屿,现在手上有的票为Mask的最小代价 通过船票来进行转移即可 #include &lt;cstdio&gt; #include &lt;iostream&gt; #include &lt;cstring&gt...

IcePrincess_1968's World 275

【rPPG】基于多光谱摄像头的非接触式睡眠血氧监测系统(传统建模方法解析)

本文深入解析了基于多光谱摄像头的非接触式睡眠血氧监测系统,重点探讨了rPPG技术的原理、硬件设计及传统建模方法。通过多光谱摄像头捕捉皮肤微弱光学变化,实现医疗级精度的心率和血氧监测,特别适合长期睡眠监测场景。文章详细介绍了摄像头选型、照明系统设计以及PBV模型等核心技术,并对比了与传统传感器的性能差异。

weixin_30300225的博客 564

如何用YOLOv5改进无人机小目标检测?MFFSODNet实战教程(附代码)

本文详细介绍了如何利用YOLOv5框架结合MFFSODNet网络结构优化无人机航拍图像中的小目标检测。通过引入微小目标预测头、多尺度特征提取模块(MSFEM)和双向密集特征金字塔网络(BDFPN)等核心技术,显著提升了小目标检测精度。文章提供了完整的代码实现方案,并展示了在农业监测、电力巡检等实际场景中的应用效果。

sre5engineer的博客 740

Topcoder问题解答目录

test

zgottingen的专栏 903

4、双足机器人mpc基础概念

机器人控制实际上不是连续的,是离散的,这就是控制信号的采样周期dt,一般每1ms对机器人发起一次控制信号。一般来说,dt越小,控制器的响应速度越快,但是由于预测的精度有限,如果控制时域过长,预测的误差会逐渐累积,导致控制器的性能下降。注意:1)在程序处理时,u的维度并不是由机器人的自由度确定的,是由其变量的个数及每个变量的空间维度确定,对于双足,采用力矩和力来控制,则u的维度是“2*2*3=12”。机器人实际运动过程中表现出来的状态x,x和xd是一致的,也包括运动速度ν、角速度ω、角度θ、位置p等。

1213

Topcoder SRM 672 Div.2 题解

T1: 判断两个集合A、B的关系,包括A包含B,B包含A,A和B完全相同或者A和B不满足以上所有的关系。 那么模拟一下。可以开一个hsh数组标记一下,对于一个A[i],将hsh[a[i]]–;对于一个B[i],将hsh[B[i]]++。这样有一个好处,就是如果这个数即存在于a数组,也存在于b数组,可以相互抵消。最后分四种情况特判一下就可以啦。 代码如下: 我是代码 T2 这题给定一...

dyt's Blog 496

博途PLC如何建立与笔记本电脑端的连接?(新手必会)

对S7-1500PLC下载硬件组态或程序,需要建立PC与PLC的连接。 由于S7-1500CPU都具有PN端口,因此建立PC与S7-1500PLC的连接通常使用工业以太网来实现。 1.使用网线连接PC-PLC 使用网线,一端连接PC的以太网卡端口,另一端连接S7-1500CPU的PN端口。 2.设置本机IP地址 2.1 确认本机要设置的IP地址段 本机IP地址要和PLC程序组态IP地址段前三位保持一致,后一位使用组态中没有用到的IP地址段。如下图所示。 那么看了这个图片应该就知道了,地址应该设置成192.

weixin_42430971的博客 1万+

亚马逊爬虫实战:中国商家信息(电话)爬取

import os), # 保存图片的路径# 搜索关键词"keywords":["毛巾","衣服"],"product_number": 1000000000000000, # 分页获取数量# 和url一一对应 个数要一样"remarks": ["备注1"],# 以下内容非专业人员请勿更改,请找开发人员更改. 对应的是amazon_product_url_setting文件中名称.},

youbingchen的博客 1525

Topcoder:SRM 708 算法题解

题目翻译 250分题目:SafeBetting 赌徒有b块钱,他想把自己手上的钱增加到c块,同时他又不想输的太惨,因此必须保证每次下注后手上不少于a块钱。每次下注,赢了则下注的钱按双倍奉还(收益率100%),输了则分文不剩(收益率-100%)。问赌徒至少需要下注几次才能达到目标。 500分题目:BuildingStrings 定义一个字符串的得分score为:字符串

Hans__Yang的博客 2258

【Claude Code 实战】第十章:DevOps 与 CI/CD 集成 / 光子AI

本章摘要:探讨Claude Code在DevOps与CI/CD集成中的应用。DevOps作为现代软件工程核心,结合AI技术实现自动化全流程,从代码提交到生产部署。通过CALMS模型(文化、自动化、精益、度量、分享)解析DevOps理念,对比传统瀑布模式与DevOps模式差异,展示AI如何加速Dockerfile编写、CI/CD配置等任务。典型示例显示AI可将原本30-60分钟的手动配置缩短至1-2分钟,大幅提升DevOps效率。

AI天才研究院 367

TopCoder SRM469C: TheMoviesLevelThreeDivOne 题解

很好的dp题目 我们尝试推断某一个人A能不间断的看完电影的条件 易得,A想要在看完B的第i-1部电影之后不间断的看B的第i部电影,应该满足以下条件:∑Atotk=1A[xk]+∑i−1k=1A[yk]−∑ik=1B[yk]≥0∑k=1AtotA[xk]+∑k=1i−1A[yk]−∑k=1iB[yk]≥0\sum_{k=1}^{Atot}A[x_k]+\sum_{k=1}^{i-1}A[y_k]...

IcePrincess_1968's World 515

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Topcoder SRM625 题解

给出一个字符串求是palindrome和anagram的比率是多少。 知识点: 1 DBL_MAX 64位double的最长数大概是1.7E308,很大很大,比long long大上不知多少倍,故此大概能容纳150!的数值,不能容纳200!的数值 2 偶数的时候,不能有字母重复为基数次,否则不能组成palindrome 3 基数的时候,只能有且只有有一个字母重复为基数次,用于放在中

靖空间 1637

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Topcoder SRM 698 题解

D1L1 枚举分界点。 拆成两个串,然后就是个类似于LCS的DP了。 #include <iostream> #include <cstring> using namespace std; const int INF = 1e9+7; int dp[102][102]; struct RepeatString { int minimalModify(string...

weixin_34273046的博客 216

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TopCoder SRM570题解

掉回Div 2了……尼玛…… 依旧是翻译向。官方题解:http://apps.topcoder.com/wiki/display/tc/SRM+570 250pts: 题意:给定一系列指令,让一个机器人在一个无限区域内移动。指令包括向前移动x格以及顺时针旋转90*x度。求运行指令T次之后机器人距起始位置的曼哈顿距离。T很大。 分析:先模拟求出运行一次指令后机器人距起始位置的距离d和

huzecong的博客 2252

TopCoder SRM 560 Div 1 - Problem 1000 BoundedOptimization & Codeforces 839 E

传送门:https://284914869.github.io/AEoj/560.html 题目简述: 定义"项"为两个不同变量相乘。求一个由多个不同"项"相加,含有n个不同变量的式子的最大值。另外限制了每一个变量的最大最小值R[i]和L[i]和所有变量之和的最大值Max。 n<=13 题外话: 刚开始做这道题的时候,感觉意外眼熟? codeforces 839 ...

aicui6749的博客 165

Topcoder SRM 602 div1题解

打卡~ Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加就会加D[i],如果减就会减D[i],但是如果rating小于0了就变成0,这个人不太喜欢比较厉害的颜色,所以他不能连续两次rating大于等于2200,求颜色变化的最多个数,保证比赛最多50场,...

weixin_30608503的博客 269

TopCoder SRM 675 Div2 题解 (填坑速度感天动地)

232.66+368.81+685.73=1287.2 T2花的时间有点久,T1也没上240… 不过难得A了还是很开心的~~ 题解要不就坑着叭QAQ

ymzqwq的博客 908

TopCoder SRM 607 题解

。。。第一次进div1,就一道都没有搞出来,第一题理解错了题意,第二题乱搞没有成功,第三题没看 。果然深夜+感冒不是适合刷题的模式啊,不过幸好还保持在blue。 最后看了看WJMZBMR神犇的代码,表示自己果然傻逼,连第一题这样的傻逼题都没A。 250pt: 分奇数和偶数长度分别讨论,然后直接枚举中心和长度计算即可。。。 (一开始理解错题意,以为不是按顺序拼凑,对出题人只能呵呵,明

Ciocio 1503

TopCoder SRM 629 题解

题目A: Problem Statement   There is a rectangular hole in the ground. You are given the dimensions of this rectangle: ints holeH and holeW. You have a rectangular board. You are

u010084308的专栏 1774

TopCoder SRM484 div1 250 题解

是前天比赛的第一题,觉得蛮有意思的,在这里提一下。 首先我们知道打表是肯定可以过的==只是judge上交不了那么长的代码==Description打表中我们可以发现一些规律 比如每一位最大是3 我们来证明这个结论。 首先我们证明二位数的结论 首先S2S^2(ab¯¯¯\overline{ab})=(a+b)2(a+b)^2=a2a^2+b2b^2+2ab S(ab¯¯¯2\overlin

bblss123的博客 644

CodeChef QRECT: Rectangle Query 题解

这题的思路还是挺巧妙的 最关键的一步是我们改求与当前矩形不相交的矩形个数 那么显然可以容斥,用完全在上面的+下面的+左面的+右面的-四个角上被重复算的 前面的四个比较好搞,以上面举例,插入矩形时把矩形的下边界插入树状数组,查询时抓住当前矩形的上边界在树状数组里查就好了 四个角的部分,以左上角为例,插入矩形时把矩形的右下角记录下来,查询时查矩形的左上角的左上方有多少个点 所以现在相当于要实...

IcePrincess_1968's World 741

Codeforces #778C: Peterson Polyglot 题解

考虑启发式合并 对于每个点,我们考虑删去它以后,它的子树们合并之后能减少多少个点,每次把小子树向大子树合并即可,这个点的贡献加到它所在的深度中 最后统计一波答案即可 下面简证为什么这样启发式合并的复杂度是O(nlogn)O(nlogn)O(nlogn)的 我们考虑某一个节点u,他可能会在若干次合并操作中被用到,具体来说,它会在它的若干祖先中以不同的深度被用到 假设节点u在若干子树中深度分...

IcePrincess_1968's World 650
上一篇: TopCoder SRM450C: RowGame 题解
下一篇: AtCoder Regular Contest 080C: 4-adjacent 题解
IcePrincess_1968
博客等级 码龄9年 13粉丝 182原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值