Floods (想法题)

2024-02-07 10:40
文章标签 想法 floods

本文主要是介绍Floods (想法题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题:Gym-101808E

题意:

有一个用n个点表示的山峰,问下雨的时候最多可以积多少的水

解析:

首先,我们应该可以想到,找出最高点,往次最高点延申
这里写图片描述

这里有两种做法


我们对于次最高点求出其往最高点平移是碰到的那个点,然后把从那个点开始到次最高点的所有点组合成一个多边形,用叉积求一下这个多边形的面积,就是水的面积了


struct point{F x,y;point(){}point(F x,F y):x(x),y(y){}
};
Point P[1005];
int n;
double PolygonArea(){double sum = 0;Point O = Point(0, 0);for (int i = 0; i < n; i++)sum += Cross(P[i] - O, P[(i + 1) % n] - O);if (sum < 0)sum = -sum;return sum / 2;
}

第二种方法比较简单,写起来简单一些,我们对第一种方法进行优化,在次最高点延申后不急于求水的面积,而是求,此最高点和最高点之间的山和水的面积和(要么是一个梯形,要么是一个矩形,要么是一个梯形加上矩形),最后减去山的面积就行(一个梯形)

代码:


D read(){ D ans=0; char last=' ',ch=getchar();
while(ch<'0' || ch>'9')last=ch,ch=getchar();
while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
if(last=='-')ans=-ans; return ans;
}struct node{F x,y;int id;bool operator <(const node a)const{return y<a.y;}
}po;F x[100009],y[100009];int main(){int t=read();while(t--){int n=read();priority_queue<node>q;for(int i=1;i<=n;i++){scanf("%lf%lf",&po.x,&po.y);x[i]=po.x,y[i]=po.y;po.id=i;q.push(po);}int l=q.top().id,r=q.top().id;q.pop();F ans=0;while(!q.empty()){po=q.top();q.pop();if(po.id<=r&&po.id>=l)continue;int a,b;if(po.id<l)a=l,b=l-1;else a=r,b=r+1;if(y[po.id]==y[a])ans+=(y[a]+y[po.id])*abs(x[a]-x[po.id])/2.0;//相同高是矩形else if(po.id==b)ans+=(y[a]+y[b])*abs(x[a]-x[b])/2.0;//相邻是梯形else {//否则是一个梯形加一个矩形F K=(y[a]-y[b])/(x[a]-x[b]),B=y[a]-(y[a]-y[b])*x[a]/(x[a]-x[b]);F xx=(y[po.id]-B)/K;ans+=abs(xx-x[po.id])*y[po.id]+(y[po.id]+y[a])*abs(x[a]-xx)/2.0;}l=min(l,po.id),r=max(r,po.id);}for(int i=1;i<n;i++){ans-=abs(x[i]-x[i+1])*(y[i]+y[i+1])/2.0;}printf("%.8f\n",ans);}
}

这篇关于Floods (想法题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/687450

相关文章

关于并发的一些想法

1.多个用户同时访问一个网站系统是并发,也会造成并发问题(但这个问题不是线程间的并发问题,不是对临界变量的并发问题。这个很容易混淆的)。这里造成的并发的问题是由于用户过多发出的http的请求过多,程序排队处理这些请求,同时,对于同一个数据库和同一tomcat来承受这些请求(可能千万个请求),同时服务器的cpu和内存等都会有问题,必然导致用户响应界面效果不好,产生卡顿现象。因此,才有了分布式、集群、

sobel_dir 方向图和sobel的一些想法

怎么使用呢! 1,通过方向图可以提取 直线 或水平线region区域,提出来的dirregion区域 2,通过sobel的幅度度,分割出变化剧烈的区域 fuduregion 3,两个region相交,可以准确定位幅度范围内+方向的边界 4,sobel算子是可以只做x,y方向的单项幅度图的,sobel_amp在一定场合有特别的用处,值得关注 5,关于大掩码超过3的size,要注意的

有关微信公众平台和html5的想法

在师哥的引导下,我接触了微信公众平台,通过这段时间的感性认识,产生了一个想法就是在微信公众平台上退出一款自己的宠物,可惜技术达不到,现在只能想想而已。不过,在初步了解html5之后,我发现,这并不是不可能实现的事情。 我说下这么想的原因吧,很简单,在微信公众平台上阅读消息,实际上就是通过微信内置的浏览器来实现的。并且自己做的div网页效果,在这个内置的浏览器上能很好的表现出来。另一个原因就是ht

有于AI想法

AI 模型的全面评估和比较   在对不同类型的 AI 模型进行全面评估和比较时,精度、速度和鲁棒性是关键指标。   精度是衡量 AI 模型准确性的重要指标。对于全能型 AI 模型,其在处理多种任务时的综合精度至关重要。然而,与专业型 AI 模型相比,全能型在特定领域可能难以达到同等的高精度。例如,在医学影像诊断领域,专业型 AI 模型经过大量特定数据的训练,能够更准确地识别病变。而全能型 AI

C++学习想法

今天是周一,今天做早操的时候舍友说准备买一本C++基础的书。我觉得这样的想法很好,突然想到自己最近几天因为自己私人原因事情很忙,蛋这不能成为我不学C++的理由。所以我在这规划了我这一周的学习进程。首先我要完善我的学生管理系统。其次就是我要好好准备周三的C++课。我现在好准备在这个月结束前开始学习JAVA,不知道我能不能实现。现在我的C++学的都还不是很精通,就开始学习java不知道是不是好高骛远呢

关于《丑陋的中国人》一些想法

看完《丑陋的中国人》,发现柏杨老师纯粹就是个喷子(不能叫愤青了)。如果他活到了现在的网络社会,肯定是个键盘侠,也是个制造热度的高手。   其实看过书之后,不难发现柏杨将中国人描述成这样子:   丑陋的中国人,偏执,迂腐,喜欢站在道德制高点,素质低。心胸狭隘,城府极深,明里一套暗地一套。阴暗,脏乱吵,嗓门大,没有安全感。喜欢窝里斗,不团结,打仗打不过日本人,做生意做不过日本人。死不认错,宁愿

关于车的一点小想法

今天看到一个有趣的新闻, 说是重庆有两个哥们开车发生摩擦, 当街划石头剪刀布“定责”。 城市道路拥挤,乡村道路复杂,擦擦碰碰难免,当事故发生后, 有这两个哥们这样的心胸却是很少。 这种摩擦是比较烦人的, 本来对车的性能影响也不大,但是总开着一辆事故车上路,估计那天就被交警小哥哥拦下来喝茶了。所以要去补漆啥的,至少就是一周时间,想想就烦人。 我在想能不能减小这种摩擦事故呢? 其实应该有人想到了

关于代理的改进想法

网络编程,如今已经封装为socket编程,无意大大的缓解了编程的难度。因为网络设备其实是多种多样的,上层人员如果去掌握这些网络设备,然后再实现他们的功能,可能不是很现实。 socket编程将程序简化为下面的形式: A B 然而A和B之间,其实还有很多其他的节点。

今天写些有用的,关于学习的,和关于40期项目读后感的一些想法

兄弟连这地方,我是越来越喜欢了,这是一个很安静的教育园区,它有点像古代高手休练闭关的地方,绝对能让你练出一身好功夫,同时,难能可贵的是,这个园区的男女比例很平衡,具我身边的小明上网所查,在我们隔壁的教学楼里,有一个空姐培训学院,给祖国培养大批量的专业人才。听他这么说后,我才想起来那天早上看的俩姑娘原来都是未来的空姐啊,那一个个的穿着红制服+黑丝,白静的小脸,170的个头,杨柳细腰,那看了

按自己的想法去理解事件和泛型(C#)

按自己的想法去理解事件和泛型(C#) 上一篇那些年困扰我们的委托(C#)讲了委托,这一篇自然就轮到事件了。 不喜欢官方的表达方式,喜欢按照自己的想法去理解一些抽象的东西,我是一个喜欢简单怕麻烦的人。 事件 考虑到委托使用的一些缺陷,就有了事件。委托是不安全的,打个比方,如果把委托当作共有字段,那么事件就相当于是属性的概念。 事件就是被限制使用的委托变量,事件里面封装了一个多播委托。 事件语法:p