Cuadrados de Poj Kadj (geometría)

  • Cuadrados Kadj

  • El significado de la pregunta es
    dar las longitudes de los lados de N cuadrados, rotar 45 grados en sentido antihorario a lo largo del vértice inferior izquierdo, y un vértice está en el eje x. Un vértice del primer cuadrado se coloca en el eje y, de izquierda a derecha, lo que permite que los lados se superpongan pero no que las áreas se crucen, de modo que esos cuadrados se puedan ver cuando se ven desde la parte superior.

  • Idea
    Al principio, primero obtuve las coordenadas de by luego conocí las coordenadas de los extremos izquierdo y derecho, y luego juzgué si el rectángulo estaba cubierto, no sé si estaba escrito mal o la precisión estaba estancada. Más tarde descubrió que podemos expandir la longitud del lado en 2 \ sqrt 22 En este momento, los extremos izquierdo y derecho son todos números enteros. Luego juzgue si está cubierto de acuerdo con los extremos izquierdo y derecho.
    Cómo encontrar el extremo izquierdo de un rectángulo

  • Código

#pragma GCC optimize(2)
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
//#include<cmath> 

using namespace std;

typedef long long ll;
typedef unsigned long ul;
typedef unsigned long long ull;
#define pi acos(-1.0)
#define e exp(1.0)
#define pb push_back
#define mk make_pair
#define fir first
#define sec second
#define scf scanf
#define prf printf
#define sqt sqrt(2.0)
typedef pair<ll,ll> pa;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int MAX_N=55;
int N;
int a[MAX_N],l[MAX_N],r[MAX_N];
int abs(int n){
    
    
	return n>0?n:-n;
} 
int main()
{
    
    
//  freopen(".../.txt","w",stdout);
//  freopen(".../.txt","r",stdin);
	ios::sync_with_stdio(false);
	while(cin>>N&&N){
    
    
		int i,j,k,L,R;
		for(i=1;i<=N;i++)
		cin>>a[i];
		for(i=1;i<=N;i++){
    
    
			L=0;
			for(j=1;j<i;j++){
    
    
				L=max(L,r[j]-abs(a[i]-a[j]));
			}
			l[i]=L;
			r[i]=L+2*a[i];
		} 
		for(i=1;i<=N;i++){
    
    
			L=l[i];
			R=r[i];			
			for(j=1;j<=N;j++){
    
    
				if(i==j)
				continue;
				if(j<i)//左边的正方形能覆盖的最大坐标 
				L=max(L,r[j]);
				else//右边的正方形能覆盖的最小坐标 
				R=min(R,l[j]);
			}
			if(L<R)
			cout<<i<<' ';
		}
		cout<<endl;
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43311695/article/details/108964386
Recomendado
Clasificación