首页 > 其他分享 >CF340B的题解

CF340B的题解

时间:2024-03-27 12:44:47浏览次数:16  
标签:hyh 题解 CF340B int 对角线 y1 x1

(一)

枚举对角线。

然后分别找正在对角线上方的点与对角线端点构成三角形面积的最大值。

和在对角线下方的点与对角线端点构成三角形面积的最大值。

如果所有点都在同侧,那么不算。

通过过两点直线的解析式求出另一点在直线的哪一侧。

(二)

AC 代码。

#include<bits/stdc++.h>
#define hyh double
using namespace std;
int n;
hyh ans;
struct node{
	hyh x,y;
}a[310];
bool pd(hyh x1,hyh y1,hyh x2,hyh y2,hyh x3,hyh y3){
	hyh k=(y2-y1)/(x2-x1),b=y1-k*x1;
	return x3*k+b<y3;
}
hyh s(hyh x1,hyh y1,hyh x2,hyh y2){
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
hyh js(hyh x1,hyh y1,hyh x2,hyh y2,hyh x3,hyh y3){
	hyh a=s(x1,y1,x2,y2),b=s(x1,y1,x3,y3),c=s(x2,y2,x3,y3);
	hyh p=(a+b+c)/2;
	return sqrt(p*(p-a)*(p-b)*(p-c));
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i].x>>a[i].y;
	for(int i=1;i<n;i++)
		for(int j=i+1;j<=n;j++){
			hyh s1=0,s2=0;
			for(int k=1;k<=n;k++){
				if(k==i||k==j)continue;
				bool pos=pd(a[i].x,a[i].y,a[j].x,a[j].y,a[k].x,a[k].y);
				if(pos==0)s1=max(s1,js(a[i].x,a[i].y,a[j].x,a[j].y,a[k].x,a[k].y));
				else s2=max(s2,js(a[i].x,a[i].y,a[j].x,a[j].y,a[k].x,a[k].y));
			}
			if(s1==0||s2==0)continue;
			ans=max(ans,s1+s2);
		}
	printf("%.9lf",ans);
	return 0;
}

标签:hyh,题解,CF340B,int,对角线,y1,x1
From: https://www.cnblogs.com/Jh763878/p/18098721

相关文章

  • CF1864C的题解
    (一)可以将\(x\)转为二进制。考虑一个数的二进制\((1\dots10\dots0)\)。其中,第一个省略号中有什么不确定,第二个省略号里都是\(0\)。易得,每个数都可以看成这种形式。那么可以每次去掉最后一位的\(1\),易证减去的数是原数的因数。最后会得到形如\((10\dots0)\),省略号中全是......
  • AT_abc345_c的题解
    (一)首先交换相同字符不改变字符串形态,那么就先统计是否有相同字符。交换不同字符容易证明不同操作后字符串各不相同。用前缀和或后缀和维护\(i+1\)到\(n\)中与\(i\)位置字符不同的数量。(二)AC代码。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd......
  • AT_abc344_e的题解
    (一)这次ABC有点水。每个数记录前面那个数,和后面那个数。对于每个数,开个数组记录值,用map记录一个值的位置(二)AC代码。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intpre[400010],cnt,las[400010],a[400010],n,q;map<int,int>mp;signedmain(......
  • CF1923B的题解
    (一)注意到\(x_i\)的绝对值\(\len\)。那么统计每一个位置的血量和。先从靠近的击杀必定最优,剩余的子弹用\(sum\)存储。还是直接上代码吧。(二)AC代码。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intt,n,k,a[300010],dis[300010],s[300010];......
  • AT_abc344_c的题解
    (一)数据范围较小,三重循环枚举选的数,用map存储可能的和即可。(二)AC代码。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m,l,q,a[110],b[110],c[110];map<int,bool>mp;signedmain(){ scanf("%lld",&n); for(inti=1;i<=n;i++)scan......
  • CF1195D2的题解
    (一)虽说代码较长,但非常好理解,还是最优解(公开的就两个)。考虑对每个数单独算贡献,循环枚举与它进行运算的数的长度,然后确定那个数的位置即可,再乘以出现的数位对应的贡献,如出现在倒数第二位就乘\(10\)。难度应该不到绿。(二)AC代码。#include<bits/stdc++.h>#defineintlonglo......
  • AT_abc343_f的题解
    (一)F<E。显然是线段树,虽然分块也能过。每个线段树上的节点记录最大值,第二大值,最大值个数,第二大值个数。合并操作注意值相等的情况。(二)AC代码。赛事写得有点乱。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,q,a[400010];structnode{ int......
  • CF1676H2的题解
    (一)题意转化为求\(i<j\)且$a_j\lea_i$的有序对\((i,j)\)数。二维偏序,容易想到用树状数组或归并排序做。(二)AC代码(树状数组)。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,t,tree[200010],a[200010];intlowbit(intx){ returnx&-x;......
  • P10185的题解
    (一)考虑对每一种颜色单独求解。对于一次第\(k\)种的“循环”,美丽度会加上\[\sum_{i=1}^{a_k}C_{n}^{i}\timesv_k^{i}=(v_k+1)^{a_k}-1\]相信大家都学过二项式定理。“循环”次数取决于其他珠子是否出现,即\(2^{\sum_{i=1}^{a_i}-a_k}\)。再将两式相乘就愉快AC了。(二)警......
  • CF1904C的题解
    (一)不太好想。(我看了题解才会)当\(k>2\)时,可以选两次相同的\(i\)和\(j\)。再将生成的数做差。当\(k=1\)时,直接\(Θ(n^2)\)枚举。当\(k=2\)时,先枚举第一次的\(i\)和\(j\),再用lower_bound()实现查找第二次选择的数。时间复杂度\(Θ(n^2\log_2{n})\)。注......